как произвести перестановки множества у питона?

у меня есть множество 27 элементов, и я не хочу производить все перестановки множества (27!) мне нужно 5000 случайным образом choosed перестановки, любой наконечник будет полезен...

26
задан user257522 23 January 2010 в 19:12
поделиться

5 ответов

Для генерации одной перестановки используйте random.shuffle и сохраните копию результата. Повторите эту операцию в цикле и каждый раз проверяйте наличие дубликатов (их, вероятно, не будет). Как только в вашем результирующем наборе будет 5000 элементов, остановитесь.

Для адресации пункта в комментарии случайный модуль Python's основан на Mersenne Twister и имеет период 2**19937-1, который значительно больше, чем 27! , поэтому он должен быть пригоден для вашего использования.

36
ответ дан 28 November 2019 в 06:48
поделиться

itertools.permutations. Это генератор, поэтому он не создаст весь список перестановок. Вы можете пропустить случайным образом, пока у вас не будет 5000.

-121--1445618-
import random

perm_list = []

for i in range(5000):
    temp = range(27)
    random.shuffle(temp)
    perm_list.append(temp)

print(perm_list)

10888869450418352160768000000 Я люблю большие цифры!:)

И

10888869450418352160768000001 ПРАЙМ!!

EDIT:

#with duplicates check as suggested in the comment

perm_list = set()
while len(perm_list)<5000:
    temp = range(27)
    random.shuffle(temp)
    perm_list.add(tuple(temp)) # `tuple` because `list`s are not hashable. right Beni?

print perm_list

ВНИМАНИЕ: Это никогда не прекратится, если RNG плохой!

11
ответ дан 28 November 2019 в 06:48
поделиться

itertools.permutations. Это генератор, поэтому он не создаст весь список перестановок. Вы можете пропустить случайным образом, пока у вас не будет 5000.

-121--1445618-

Может потребоваться функция itertools.permutations (). Должен любить этот модуль итертулов!

ПРИМЕЧАНИЕ: Новое в 2,6

1
ответ дан 28 November 2019 в 06:48
поделиться

itertools.permutations. Это генератор, поэтому он не будет создавать весь список перестановок. Вы можете пропустить случайным образом, пока не получите 5000.

6
ответ дан 28 November 2019 в 06:48
поделиться
# apermindex should be a number between 0 and factorial(len(alist))
def perm_given_index(alist, apermindex):
    for i in range(len(alist)-1):
        apermindex, j = divmod(apermindex, len(alist)-i)
        alist[i], alist[i+j] = alist[i+j], alist[i]
    return alist

Использование: perm_given_index(['a','b','c'], 3)

Здесь используется код Лемера для перестановки, так как значения j соответствуют этому.

4
ответ дан 28 November 2019 в 06:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: