4
>>> import itertools
>>> n = [1,2,3,4]
>>> combObj = itertools.combinations(n,3)
>>>
>>> combObj
<itertools.combinations object at 0x00000000028C91D8>
>>>
>>> list(combObj)
[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]
>>>
>>> for i in list(combObj): #This prints nothing
...     print(i)
...
  1. 我如何遍历 combObj ?

  2. 我怎样才能转换
    [(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]

    [[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]

4

3 回答 3

7

一旦你遍历itertools.combinations对象一次,它就被用完了,你不能再次遍历它。

如果您需要重用它,正确的方法是使其成为listtuple像您一样。您需要做的就是给它一个名称(将其分配给一个变量),这样它就会一直存在。

combList = list(combObject) # Don't iterate over it before you do this!

如果你只想迭代一次,你根本不调用list它:

for i in combObj: # Don't call `list` on it before you do this!
    print(i)

旁注:命名对象实例/普通变量的标准方法是comb_obj而不是combObj. 有关详细信息,请参阅PEP-8

要将内部tuples 转换为lists,请使用列表推导和list()内置:

comb_list = [(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]
comb_list = [list(item) for item in comb_list]
于 2011-10-17T00:08:24.017 回答
0

要转换为列表列表,您可以执行以下操作:

[list(item) for item in combObj]
于 2011-10-17T00:14:08.777 回答
0

生成器很好,因为它们不使用太多内存。如果您经常使用它并且有内存,则将其保存为元组而不是生成器。

否则,我经常会在每次我想使用它时创建一个函数来返回生成器:

>>> def get_combObj():
...     return itertools.combinations(n,3)
...
>>> for i in get_combObj():
...     print list(i)
...
[1, 2, 3]
[1, 2, 4]
[1, 3, 4]
[2, 3, 4]

(您可以根据需要调用 get_combObj() )

于 2011-10-17T03:47:05.107 回答