我是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)
Run Code Online (Sandbox Code Playgroud)
到目前为止工作,直到我尝试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
Run Code Online (Sandbox Code Playgroud)
可以为较小的数据集(52 C 2)创建列表,但是当数字变大,RAM可能不足时,我会得到一个MemoryError.我用google搜索了combination()函数的工作原理,显然它输出了一个对象,我将其转换为一个列表.
当我没有list()时,控制台返回了一个内存地址(我相信).
>>> all_possible_hands = itertools.combinations(deck,7)
>>> all_possible_hands
<itertools.combinations object at 0x02E63180>
Run Code Online (Sandbox Code Playgroud)
我的问题是:内存地址是否包含我想要的数据,并且可以并以某种方式将其转换为列表或其他内容以便我可以访问列表中的各个元素?
谢谢.任何见解都将非常感激.
在52张卡片组中有133784560七张卡组合,您正在尝试创建一个包含133784560元素的列表.Python没有足够的内存来执行此操作,因此崩溃了.
itertools.combinations返回一个迭代器.这就像一个列表,除了它只是按需提供一个元素,而不是一次创建所有元素.这节省了内存.是否能从迭代器中获得所需内容取决于您想要做什么.如果你只想打印每一个,你可以轻松地做到:
for item in itertools.combinations(deck, 7):
print item
Run Code Online (Sandbox Code Playgroud)
你不能轻易做到的是得到一个特定的项目.没有直接相当于做list_l[5]第五个元素.你必须迭代迭代器5次,或者使用其他工具itertools(比如islice).