Большой список управления памятью поколения - PullRequest
2 голосов
/ 26 марта 2020
import itertools
Num = 11

base = list(range(1,Num+1))

Permutations = list(itertools.permutations(base))

Я получаю ошибку памяти при попытке запустить это. На самом деле мне нужно только сгенерировать 1-й (Num-1)! перестановки, но я не уверен, как это сделать (поэтому, если Num = 7, мне нужно сгенерировать первые 6! = 720 перестановок). Но в идеале я хотел бы иметь возможность генерировать перестановки для значительно более высоких значений Num, поэтому любые предложения будут полезны

1 Ответ

3 голосов
/ 26 марта 2020

range() и permutation() оба возвращают генераторы, которые генерируют элементы по требованию. Вам не нужно звонить list() и превращать их в списки. Просто итерируйте их напрямую и обращайтесь к элементам один за другим.

num = 11
base = range(1, num+1)
permutations = itertools.permutations(base)

for permutation in permutations:
    # Do something with `permutation`.

(Обратите внимание, что генератор можно использовать только один раз. Если вы хотите перебирать перестановки более одного раза, вам нужно вызвать itertools.permutations() несколько раз.)

до остановка после n предметов использование itertools.islice():

for permutation in itertools.islice(permutations, n):
    # Do something with `permutation`.

Вы можете пропустить пункты на начало тоже. Это пропустит первые пять перестановок:

for permutation in itertools.islice(permutations, 5, n):
    # Do something with `permutation`.

Если вы хотите подсчитать перестановки, вы можете добавить enumerate(), который прикрепляет индекс к каждой записи:

for i, permutation in enumerate(itertools.islice(permutations, n)):
    # Skip the fifth permutation.
    if i == 4:
        continue

    # Do something with `permutation`.

По Кстати, пожалуйста, используйте строчные буквы для имен переменных. Только имена классов должны быть заглавными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...