有效地在python中排列几个列表

时间:2016-04-25 05:09:00

标签: python random permutation product itertools

我正在尝试编写一个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个排列,它们将完全随机但确保它们永远不会被重复?

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