itertools.combinations()的输出

时间:2013-04-19 08:01:44

标签: python list

我是python编程的新手(好吧,编程一般),所以我真的希望有人可以帮助我使用内置的itertools.combinations函数。

我正在尝试从52张卡片列表中创建所有可能组合7张卡片组合的列表,即52 C 7。

所以我的代码看起来像

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

可以为较小的数据集(52 C 2)创建列表,但是当数字变大,RAM可能不足时,我会收到MemoryError。我用google搜索了combination()函数的工作原理,显然它输出了一个对象,我把它转换成了一个列表。

当我没有list()时,控制台返回了一个内存地址(我相信)。

>>> all_possible_hands = itertools.combinations(deck,7)
>>> all_possible_hands
<itertools.combinations object at 0x02E63180>

我的问题是:内存地址是否包含我想要的数据,并且可以并以某种方式将其转换为列表或其他内容以便我可以访问列表中的各个元素?

谢谢。任何见解将不胜感激。

2 个答案:

答案 0 :(得分:5)

在52张牌中有133784560七张牌组合,你正在尝试创建一个包含133784560元素的列表。 Python没有足够的内存来执行此操作,因此崩溃。

itertools.combinations返回一个迭代器。这就像一个列表,除了它只是按需提供一个元素,而不是一次创建所有元素。这节省了内存。是否能从迭代器中获得所需内容取决于您想要做什么。如果你只想打印每一个,你可以轻松地做到这一点:

for item in itertools.combinations(deck, 7):
     print item

你不能轻易做到的是得到一个特定的项目。没有直接相当于做list_l[5]来获得第五个元素。您必须迭代迭代器5次,或使用itertools中的其他工具(如islice)。

答案 1 :(得分:1)

此对象是由iterator函数itertools.combinations返回的generator。您可以通过迭代此对象来访问每个组合:

for hand in all_possible_hands:
     print hand

迭代器有助于避免一次将所有数据保存在内存中,但缺点是您只能访问每个项目一次。当您完成对对象的迭代时,它已经耗尽,您无法从中获取任何其他内容。此外,与常规列表等不同,您无法在不进行迭代直到结束时访问最后一项。

您也可以编写生成器函数。 itertools docs中有一些例子。生成器函数应该有一个或多个yield statements而不是return statements

相关问题