直接从itertools函数打印吗?

问题描述 投票:0回答:1

我想打印列表[0,1,2,3,4,5,6,7,8,9]的第100万个排列。我通过下面的代码对此进行了管理。

import itertools
perm=[]

for i in range(10):
    perm.append(i)
arr=[]
arr=list(itertools.permutations(perm))#stores the permutations in a list

print(arr[(10**6)-1])#prints the 1 millionth permutation

之所以有用,是因为排列的数量只有10!〜3.6 * 10 ^ 6,所有排列都可以容纳在内存中。但是我希望存储所有字母26!〜4.03 * 10 ^ 26的排列,所有这些排列显然不能容纳在内存中。

import itertools
perm=[]

alphabet="qwertyuiopasdfghjklzxcvbnm"

for i in alphabet:#stores the letters as separate entries in the list
  perm.append(i)

arr=[]
arr=list(itertools.permutations(perm))

print(arr[(10**6)-1])#prints the 1 millionth permutation

上面的程序崩溃了,我不建议运行它。一个明显的解决方案是遍历排列,而无需先将其存储在内存中,而仅打印百万分之一的排列。

python optimization memory-management permutation itertools
1个回答
1
投票

您可以在itertools.islice生成器上使用itertools.permutations(perm),而不是将整个序列存储在内存中:

next(itertools.islice(itertools.permutations(perm), (10**6)-1))

此返回:

('q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm')
© www.soinside.com 2019 - 2024. All rights reserved.