2017-03-24 73 views
1

我使用itertools生成組合,並試圖打印每個組合。
在這個簡單的任務中,for循環和列表理解均失敗。For loop不打印項目

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)'來耗盡它。之後它有零個元素,所以沒有'comb'左邊的顯示。 – 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 comprehensionfor loop都在StopIteration上結束,因此它們只運行零次。

你可以,但是,這樣做:

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)]