我正在使用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]: []
关于为什么我看不到所有组合的任何想法?
答案 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 comprehension
和for 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)]