我正在尝试编写一个python脚本,它将生成多个列表的随机排列而不重复
i.e. [a,b] [c,d]
a, c
b,c,
a,d
b,d
我可以使用以下方法生成每个排列,但结果有点不随机:
for r in itertools.product(list1, list2):
target.write("%s,%s" % (r[0], r[1])
有没有人知道我可以实现这一点的方式,这样我只能提取2个排列,它们将完全随机但确保它们永远不会被重复?
答案 0 :(得分:2)
您可以使用random.choice()
:
>>> from itertools import product
>>> import random
>>> l1 = ['a', 'b', 'c']
>>> l2 = ['d', 'e', 'f']
>>> prod = tuple(product(l1, l2))
>>>
>>> random.choice(prod)
('c', 'e')
>>> random.choice(prod)
('a', 'f')
>>> random.choice(prod)
('c', 'd')
或者只是使用嵌套列表推导来创建产品:
>>> lst = [(i, j) for j in l2 for i in l1]
如果您不想生成重复的项目,您可以使用一个设置对象,该对象将在没有指定订单的情况下从您的产品创建一个设置对象,然后您可以简单地从中提取项目:
>>> prod = set(product(l1, l2))
>>>
>>> prod.pop()
('c', 'f')
>>> prod.pop()
('a', 'f')
>>> prod.pop()
('a', 'd')
或者使用shuffle来改变迭代,就像@ayhan在他的回答中所建议的那样。
答案 1 :(得分:1)
您可以使用random.shuffle
然后pop
来确保结果不会重复:
list1 = ["a", "b"]
list2 = ["c", "d"]
p = list(itertools.product(list1, list2))
random.shuffle(p)
e1 = p.pop()
e2 = p.pop()
list(itertools.product())
效率不高,因为它会生成并存储所有这些内容。如果您有大型列表,您可以一次生成一个并检查它们是否重复:
s = set()
list1 = ["a", "b"]
list2 = ["c", "d"]
while True:
r = (random.choice(list1), random.choice(list2))
if r not in s:
target.write("%s,%s" % (r[0], r[1]))
s.add(r)
break