在 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
对象进行了一次迭代,它就已用完,您无法再次对其进行迭代。
如果您需要重用它,正确的方法是像您一样将其设为list
或tuple
。您需要做的就是给它一个名称(将其分配给一个变量),这样它就会一直存在。
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 了解更多信息。
要将内部 tuple
s 转换为 list
s,请使用列表推导和内置 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基础- 类和对象(使用继承派生组合接口多态封装propertystaticmethodclassmethod反射slots上下文管理协议元类)