Как исправить ошибку памяти при размещении 11 элементов, выбранных из 30 элементов в python с использованием библиотеки itertools? - PullRequest
0 голосов
/ 24 июня 2019

У меня есть список игроков в крикет обеих команд.

Допустим, в общей сложности 30 игроков, и я хочу случайным образом выбрать 11 игроков из этих 30. Я хочу, чтобы все комбинации были сохранены в списке.

Я пытался использовать itertools.permutations из python.Но я получаю MemoryError.Есть ли способ исправить эту или любые другие библиотеки в Python, которые я могу использовать?

from itertools import permutations   
name=["p1","p2","p3","p4","p5","p6","p7","p8","p9","p10","p11","p12","p13","p14","p15","p16","p17","p18","p19","p20","p21","p22","p23","p24","p25","p26","p27","p28","p29","p30"]  
combinations = list(permutations(name,11))

Это ошибка, которую я получаю:

Traceback (most recent call last):  
  File "PythonDemo.py", line 3, in <module>  
    combinations = list(permutations(name,11))  
MemoryError

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Выбор 11 элементов из 30 может быть сделан 30!/(30 - 11)! способами, что составляет около 2e+16.Таким образом, требуемый список займет несколько эксабайт памяти!

Поскольку предварительные вычисления всех перестановок совершенно исключены, могу ли я предложить использовать random.choices:

import random

name = ["p1","p2","p3","p4","p5","p6","p7","p8","p9","p10","p11","p12","p13","p14","p15","p16","p17","p18","p19","p20","p21","p22","p23","p24","p25","p26","p27","p28","p29","p30"]

for i in range(3):
    combination = random.choices(name, k=11)
    print(combination)

Обратите внимание, что random.choices доступен только в Python 3.6.

Продолжайте использовать itertools.permutations

Вы также можете придерживаться itertools.permutations, например, сохраняя генераторживой так:

from itertools import permutations

name = ["p1","p2","p3","p4","p5","p6","p7","p8","p9","p10","p11","p12","p13","p14","p15","p16","p17","p18","p19","p20","p21","p22","p23","p24","p25","p26","p27","p28","p29","p30"]  
combinations = permutations(name, 11)

for i in range(3):
    combination = next(combinations)
    print(combination)

Обратите внимание, что при этом комбинация не будет выбрана случайным образом, а вместо этого приведет к очень предсказуемым комбинациям.Это может быть хорошо или плохо в зависимости от вашего варианта использования.

0 голосов
/ 24 июня 2019

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

import itertools

name = [f'p{a}' for a in range(1, 31)]
combinations = itertools.permutations(name, 11)

for item in combinations:
   do_the_stuff(item)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...