对于循环不打印项目

时间:2017-03-24 05:32:39

标签: python python-3.x for-loop list-comprehension itertools

我正在使用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 个答案:

答案 0 :(得分: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结尾1}},所以他们只运行零次。

但是,你可以这样做:

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

将其转换为列表,列表可以无限期遍历。

答案 1 :(得分: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)]