Печатать прямо из функции itertools? - PullRequest
1 голос
/ 28 февраля 2020

Я хотел напечатать 1-миллионную перестановку списка [0,1,2,3,4,5,6,7,8,9]. Я справился с этим с помощью кода ниже.

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

Вышеприведенная программа вылетает, и я бы не советовал ее запускать. Очевидным решением будет перебирать перестановки, не сохраняя их в памяти и печатая только миллионную перестановку.

1 Ответ

2 голосов
/ 28 февраля 2020

Вы можете использовать itertools.islice в генераторе itertools.permutations(perm) вместо сохранения всей последовательности в памяти:

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

Это возвращает:

('q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', 'l', 'b', 'n', 'z', 'm', 'k', 'c', 'x', 'v', 'j')
...