2012-04-19 4 views
1

나는 검증을 위해 사용할 라이브러리/유틸리티를 작성하고 있습니다. 나는 일련의 요소들과 그것들을 어떤 순서로 소비하는 테스트 대상 시스템을 가질 것이다. 세트는 가능한 모든 입력을 나타내며 시스템은 해당 요소의 유한 순서를 수신합니다.파이썬에서 길이 N의 N 번째 시퀀스 계산하기

def seq(s): # s is a set 
    length = 0 
    nth = 0 
    # r = calculate nth sequence of length 
    # if there are no more sequences of length, length += 1 
    # else n += 1, yield r 

것은 내가 결국 확장 할 수 있습니다 : 다음을 유한 시퀀스의 집합으로

은 달성하기 위해 나는 세트의 모든 순서를 계산하지만, 대신에 파이썬 생성기를 사용하여 구상을 찾는 게 아니에요 무한 될 것입니다 이것은 주사와 반복적 인 시퀀스에 대한 것이지만, 현재 세트의 요소는 여러 번 나타날 수 있습니다.

발전기가이 문제를 해결하는 가장 좋은 방법입니까? 이와 같은 생성기를 사용하면 재귀에서 얻은 단순성이 제거됩니까? 누구든지 나를 도울 수있는 어떤 itertools (또는 다른 모듈) 단축키를 향해 나를 가리킬 수 있습니까?

답변

2

itertools.product을 찾는 것 같습니다. 나는 이것이 당신이 요구하는지 무엇을 할 것인가 생각 :

def seq(s): 
    length = 1 
    while True: 
     for p in itertools.product(s, repeat=length): 
      yield p 
     length += 1 

지금이 같은 일을 수행 할 수 있습니다

>>> zip(range(10), seq(set((1, 2, 3)))) 
[(0, (1,)), (1, (2,)), (2, (3,)), (3, (1, 1)), (4, (1, 2)), 
(5, (1, 3)), (6, (2, 1)), (7, (2, 2)), (8, (2, 3)), (9, (3, 1))] 

또는이 :이 또한 더 압축 할 수 있습니다

>>> test_seq = itertools.izip(itertools.count(), seq(set((1, 2, 3)))) 
>>> for i in range(10): 
...  next(test_seq) 
... 
(0, (1,)) 
(1, (2,)) 
(2, (3,)) 
(3, (1, 1)) 
(4, (1, 2)) 
(5, (1, 3)) 
(6, (2, 1)) 
(7, (2, 2)) 
(8, (2, 3)) 
(9, (3, 1)) 

을, 기타 사용 itertools :

>>> from itertools import chain, product, count 
>>> s = set((1, 2, 3)) 
>>> test_seq = chain.from_iterable(product(s, repeat=n) for n in count(1)) 
>>> zip(range(10), test_seq) 
[(0, (1,)), (1, (2,)), (2, (3,)), (3, (1, 1)), (4, (1, 2)), (5, (1, 3)), 
(6, (2, 1)), (7, (2, 2)), (8, (2, 3)), (9, (3, 1))] 
+0

좋아 보인다. 그리고 시퀀스에서 반복을 허용하기 위해 combine_with_replacement (,)를 사용하겠습니까? –

+0

@ JohnCarter, 음, 위의 _does_은 시퀀스에서 반복을 허용합니다. 차이점은 위에 사용 된 n 차원의 데카르트 곱을 사용할 때 순서가 중요하다는 것입니다. '(1, 1, 2)'와'(1, 2, 1)'모두 생성됩니다. 당신이 그것을 원하지 않는다면,'combination_with_replacement'가 갈 길입니다. – senderle

+0

오른쪽. 명확히 해 주셔서 감사합니다. –

관련 문제