【发布时间】:2018-07-22 13:10:40
【问题描述】:
我正在寻找一种方法来随机采样所有排列的固定长度子集。
import itertools
from random import shuffle
mylist = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T']
方法 A
下面的方法 A 存在排列过于相似的问题。
a_pre = itertools.permutations(mylist,20)
a = itertools.islice(a_pre,3)
list(a)
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L '、'M'、'N'、'O'、'P'、'Q'、'R'、'S'、'T']
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L '、'M'、'N'、'O'、'P'、'Q'、'R'、'T'、'S']
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L '、'M'、'N'、'O'、'P'、'Q'、'S'、'R'、'T']
方法 B
方法 B 让我更接近我想要的结果,但这里总是存在在列表之间产生相同排序的风险,因此这种方法不可行。
#repeat n=3 times
shuffle(mylist)
print(mylist)
['J', 'B', 'M', 'A', 'O', 'C', 'K', 'S', 'H', 'Q', 'N', 'T '、'R'、'D'、'G'、'P'、'I'、'E'、'F'、'L']
['R', 'O', 'C', 'I', 'G', 'E', 'Q', 'L', 'P', 'J', 'F', 'N '、'A'、'B'、'H'、'T'、'D'、'K'、'M'、'S']
['L', 'O', 'I', 'G', 'B', 'E', 'R', 'A', 'D', 'N', 'J', 'S '、'H'、'F'、'K'、'M'、'Q'、'T'、'C'、'P']
【问题讨论】:
-
您要生成多少个排列?您可以将已经拥有的那些存储在一个集合中(例如,在将列表连接到字符串之后,或者将其转换为元组之后)并避免使用已经使用的那些。
-
对于给定的列表,有 20 个! = 2432902008176640000 种不同的排列,所以碰撞真的非常不可能。
标签: python permutation itertools