我是一个用python编程的新手(好吧,一般是编程),所以我真的希望有人能帮助我使用内置的itertools.combinations函数。
我正在尝试从52张牌的列表中创建一个所有可能的组合7牌组合的列表,即52张C7。
所以我的代码看起来像这样
>>> import itertools
>>> deck = [1,2,3,4,5...,52]
>>> list_1 = list(itertools.combinations(deck,2))
>>> list_1[5]
(1, 7)
到目前为止,直到我尝试了7种组合
>>> all_possible_hands = list(itertools.combinations(deck,7))
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
all_possible_hands = list(itertools.combinations(deck,7))
MemoryError
这个列表可以为较小的数据集(52C2)创建,但是当这个数字变大时,我会得到一个MemoryError,可能是内存不足。我在googled上搜索了combinations()函数是如何工作的,显然它输出了一个对象,并将其转换为一个列表。
当我不使用list()时,控制台返回一个内存地址(我相信)。
>>> all_possible_hands = itertools.combinations(deck,7)
>>> all_possible_hands
<itertools.combinations object at 0x02E63180>
我的问题是:内存地址是否包含我想要的数据,并且可以以某种方式将其转换为列表或其他东西,以便我可以访问列表中的各个元素?
谢谢。任何有见地的人都会非常感激。
发布于 2013-04-19 16:08:00
在包含52张牌的扑克牌中有133784560张七张牌的组合,而您正在尝试创建一个包含133784560个元素的列表。Python没有足够的内存来做这件事,所以它崩溃了。
itertools.combinations
返回一个迭代器。这就像一个列表,只是它一次只给你一个元素,按需,而不是一次创建所有元素。这节省了内存。你是否能从迭代器中得到你想要的东西取决于你想要做什么。如果你只是想,比如说,打印每一个,你可以很容易地做到:
for item in itertools.combinations(deck, 7):
print item
你不能轻易做到的是得到一个特定的物品。没有直接等同于使用list_l[5]
来获取第五个元素。您必须遍历迭代器5次,或者使用itertools
中的其他工具(如islice
)。
发布于 2013-04-19 16:07:00
此对象是一个,由generator函数itertools.combinations
返回。您可以通过迭代此对象来访问每个组合:
for hand in all_possible_hands:
print hand
迭代器有助于避免一次将所有数据保存在内存中,但缺点是每个项目只能访问一次。当你完成对对象的迭代后,它就会耗尽,你不能从它得到任何其他东西。此外,与通常的列表不同,如果不迭代到末尾,就不能访问最后一项。
您也可以编写生成器函数。在itertools
docs中有一些例子。生成器函数应该有一个或多个yield
statements,而不是return
statements。
https://stackoverflow.com/questions/16100017
复制相似问题