在 python 中使用组合对象

Posted

技术标签:

【中文标题】在 python 中使用组合对象【英文标题】:working with combinations object in python 【发布时间】:2011-12-08 22:46:21 【问题描述】:
>>> 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)
...

    如何遍历 combObj ?

    如何转换[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)][[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]

【问题讨论】:

【参考方案1】:

一旦您对 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]

【讨论】:

知道了!我不知道你不能第二次迭代它。谢谢!关于 PEP8,我读过它,但我感觉很难改变我命名变量、函数等的方式。我不知道,每次我用不同的语言工作时改变风格感觉不对/跨度> 如果您只是为自己编写代码,那么使用您喜欢的任何样式都不是问题。但是,如果您将代码提交给任何更大的社区,无论是否专业,您通常都需要遵守他们的样式规则。 Python 只是试图将它的所有社区统一在一个单一的风格之下——他们减少你需要知道的风格的数量,而不是增加它。我希望我也可以始终以自己的风格编写代码,这是不可能的。【参考方案2】:

要转换为列表列表,您可以:

[list(item) for item in combObj]

【讨论】:

list(map(list, combObj)) @Austin,map 没有返回 Python3 的列表。注意 Python-3.x 标签 @gnibbler,啊。谢谢!评论已删除。【参考方案3】:

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

否则我经常做一个函数来每次我想使用它时返回生成器:

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

【讨论】:

以上是关于在 python 中使用组合对象的主要内容,如果未能解决你的问题,请参考以下文章

python类与对象的组合与继承

对象上的 Python itertools 组合

Python基础- 类和对象(使用继承派生组合接口多态封装propertystaticmethodclassmethod反射slots上下文管理协议元类)

Python基础day-18[面向对象:继承,组合,接口归一化]

python_面向对象_组合

python_面向对象_组合