2017-03-24 3 views
1

나는 itertools을 사용하여 조합을 생성하며 모든 조합을 인쇄하려고합니다.
for 루프와 목록 이해 모두가이 간단한 작업에서 실패합니다.루프가 항목을 인쇄하지 않는 경우

In [1]: from itertools import combinations 

In [2]: combos = combinations(range(3), 2) 

In [3]: list(combos) 
Out[3]: [(0, 1), (0, 2), (1, 2)] 

In [4]: for comb in combos: 
    ...:  print(comb) 

In [5]: [comb for comb in combos] 
Out[5]: [] 

모든 조합이 표시되지 않는 이유에 대한 의견이 있으십니까?

+2

반복자입니다. 당신은'list (combos)'로 그것을 고갈 시켰습니다. 그 후 그것은 제로 요소를 가지므로 표시 할 "빗"이 없습니다. – TemporalWolf

+0

단순히'list (combos)'를 출력하여 비어 있지 않음을 보여줍니다. – Peaceful

+0

@TemporalWolf : True !! 나는 너무 어리 석다! – Peaceful

답변

3

그것은 iterator입니다. 너는 list(combos)로 고갈시켰다. 제로 요소를 가지고, 그래서 거기에있어 그 후 더 comb 디스플레이에 남아 있지 :

>>> import itertools 
>>> combos = itertools.combinations(range(3),2) 
>>> combos 
<itertools.combinations object at 0x0000000004BB66D8> 
>>> list(combos) 
[(0, 1), (0, 2), (1, 2)] 
>>> combos.next() 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
StopIteration 
>>> len(combos) 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
TypeError: object of type 'itertools.combinations' has no len() 

combos하지 목록입니다. 그것은 iterator입니다 ... 그리고 당신이 모든 조건을 완료 일단은 StopIteration 예외가 발생하지만, list comprehensionStopIterationfor loop 모두 끝, 그래서 그들은 단지 제로 시간을 실행합니다.

당신은, 그러나, 수행 할 수 있습니다 목록과 목록으로 변환됩니다

combos = list(itertools.combinations(range(3),2)) 

이 무기한으로 이송 할 수 있습니다.

0

문제는 목록 (콤보)이 조합을 비우는 것처럼 보일 필요가 있다는 것입니다.

>>> combos = combinations(range(3), 2) 
>>> list(combos) 
[(0, 1), (0, 2), (1, 2)] 
>>> list(combos) 
[] 

그래서 목록으로 선언하고 구문 분석해야합니다.

>>> from itertools import combinations 
>>> combos = combinations(range(3), 2) 
>>> combo_list = list(combos) 
>>> for comb in combo_list:  
...  print(comb) 
... 
(0, 1) 
(0, 2) 
(1, 2) 
>>> 
>>> [comb for comb in combo_list] 
[(0, 1), (0, 2), (1, 2)]