2016-08-13 3 views
0

예를 들어 q = 2이면 [1,1] ~ [2,2] 사이의 모든 시퀀스를 생성해야합니다. q = 3이면 [1,1,1]에서 [3,3,3] 사이의 시퀀스를 생성합니다. q = 4 인 경우, [1,1,1,1] ~ [4,4,4,4] 등의 시퀀스를 생성한다.파이썬을 사용하여이 시퀀스를 생성하는 방법

시퀀스의 예. 난이 "Python generating all nondecreasing sequences"하지만받지 필요한 출력을 시도 = 3

(1, 1, 1) 
(1, 1, 2) 
(1, 1, 3) 
(1, 2, 1) 
(1, 2, 2) 
(1, 2, 3) 
(1, 3, 1) 
(1, 3, 2) 
(1, 3, 3) 
(2, 1, 1) 
(2, 1, 2) 
(2, 1, 3) 
(2, 2, 1) 
(2, 2, 2) 
(2, 2, 3) 
(2, 3, 1) 
(2, 3, 2) 
(2, 3, 3) 
(3, 1, 1) 
(3, 1, 2) 
(3, 1, 3) 
(3, 2, 1) 
(3, 2, 2) 
(3, 2, 3) 
(3, 3, 1) 
(3, 3, 2) 
(3, 3, 3) 

질문에 대한 .

현재 나는이 코드를 사용하고
import itertools 

def generate(q): 
    k = range(1, q+1) * q 
    ola = set(i for i in itertools.permutations(k, q)) 
    for i in sorted(ola): 
     print i 

generate(3) 

내가이 시퀀스를 생성하는 또 다른 좋은 방법이 필요합니다. 반복 매개 변수

답변

6

사용 itertools.product을 :

q = 2 
list(itertools.product(range(1, q + 1), repeat=q)) 
Out: [(1, 1), (1, 2), (2, 1), (2, 2)] 

q = 3 

list(itertools.product(range(1, q + 1), repeat=q)) 
Out: 
[(1, 1, 1), 
(1, 1, 2), 
(1, 1, 3), 
(1, 2, 1), 
(1, 2, 2), 
... 
+3

그래서 깨끗하고 간단! – Maxim

3

나는 당신이 반복 가능한 요소의 가능한 모든 조합을 수행하는 itertools.product()을 원하는 생각합니다. itertools.permutations()은 요소를 반복하지 않으며 itertools.combinations() 또는 itertools.combinations_with_replacement()은 정렬 된 순서로만 나타납니다 (예 : 입력 iterable의 첫 번째 요소가 결과의 마지막 요소가 아님).

from itertools import product 

def generate(q): 
    assert q > 0 # not defined for <= 0 
    return list(product(range(1,q+1), repeat=q)) 

generate(3) # [(1,1,1), (1,1,2), ..., (3,3,2), (3,3,3)] 

참조 : https://docs.python.org/3/library/itertools.html