[英]how to generate permutations of array in python?
我有一个27个元素的数组,我不想生成数组的所有排列(27!)我需要5000个随机选择的排列,任何提示将是有用的...
要生成一个排列,请使用random.shuffle
并存储结果的副本。 在循环中重复此操作,每次检查重复(尽管可能不会有任何重复)。 一旦结果集中有5000个项目,请停止。
为了解决评论中的观点,Python的随机模块基于Mersenne Twister ,周期为2**19937-1
,远大于27!
所以它应该适合您的使用。
import random
perm_list = []
for i in range(5000):
temp = range(27)
random.shuffle(temp)
perm_list.append(temp)
print(perm_list)
10888869450418352160768000000
我喜欢大数字! :)
和
10888869450418352160768000001
是PRIME !!
编辑:
#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不好,这种情况永远不会停止!
itertools.permutations
。 它是一个生成器,因此它不会创建整个排列列表。 你可以随机跳过,直到你有5000。
# 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)
这使用Lehmer代码进行排列,因为j
的值j
匹配。
您可能需要itertools.permutations()函数。 一定要喜欢itertools模块!
注意:2.6中的新功能
您可以尝试实现random_permutation
itertools配方 。 为方便起见,我使用第三方库more_itertools
为我们实现了这个配方:
import more_itertools as mit
iterable = range(27)
mit.random_permutation(iterable)
# (24, 3, 18, 21, 17, 22, 14, 15, 20, 8, 4, 7, 13, 6, 25, 5, 12, 1, 9, 19, 23, 11, 16, 0, 26, 2, 10)
为函数的每次调用创建随机排列。 我们可以制作一个生成n
调用结果的生成器。 我们将实现这个生成器,并通过一个简略示例演示随机结果:
def random_permute_generator(iterable, n=10):
"""Yield a random permuation of an iterable n times."""
for _ in range(n):
yield mit.random_permutation(iterable)
list(random_permute_generator(range(10), n=20))
# [(2, 7, 9, 6, 5, 0, 1, 3, 4, 8),
# (7, 3, 8, 1, 2, 6, 4, 5, 9, 0),
# (2, 3, 1, 8, 7, 4, 9, 0, 6, 5),
# (0, 5, 6, 8, 2, 3, 1, 9, 4, 7),
# (0, 8, 1, 9, 4, 5, 7, 2, 3, 6),
# (7, 2, 5, 8, 3, 4, 1, 0, 9, 6),
# (9, 1, 4, 5, 8, 0, 6, 2, 7, 3),
# (3, 6, 0, 2, 9, 7, 1, 4, 5, 8),
# (8, 4, 0, 2, 7, 5, 6, 1, 9, 3),
# (4, 9, 0, 5, 7, 1, 8, 3, 6, 2)
# ...]
对于您的特定问题,请使用适当的值替换iterable和调用次数n
,例如random_permute_generator(iterable, n=5000)
。
有关此工具的更多信息,另请参阅more_itertools
文档 。
细节
对于那些感兴趣的人,这是实际的配方。
从itertools食谱 :
def random_permutation(iterable, r=None):
"Random selection from itertools.permutations(iterable, r)"
pool = tuple(iterable)
r = len(pool) if r is None else r
return tuple(random.sample(pool, r))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.