从列表中取两个随机元组,使所有元素都不同

时间:2018-04-17 12:12:25

标签: python python-3.x random

在Python3中,我有一个元组列表,如下所示

('A', object1)
('B', object5)
('B', object3)
('D', object2)
('E', object3)
('F', object1)
('G', object1)

我想从元组中取两个随机元素,使得第一个随机元组的第一个和第二个元素与第二个随机元组的第一个和第二个元素不同。即,我可以从上面的列表('A', object1) and ('B', object5)中进行选择,但我无法选择('F', object1) and ('G', object1)('B', object5) and ('B', object3)

1 个答案:

答案 0 :(得分:0)

以下是使用random.sample选择一个项目并找到满足条件的第一个项目的一种优化方式:

In [116]: def rand_choos(arr):
     ...:     (f1, f2) = random.sample(arr, 1)[0]
     ...:     second = next((i, j) for i, j in arr if i != f1 and j != f2)
     ...:     return (f1, f2), second
     ...: 

In [117]: 

In [117]: rand_choos(lst)
Out[117]: (('B', 5), ('A', 1))

In [118]: rand_choos(lst)
Out[118]: (('D', 2), ('A', 1))

另请注意,在这种情况下,您将始终获得随机第一项的相同第二项(同时仍与第一项不同),因为原始列表的顺序永远不会更改。如果这是一个问题,你可以在函数的前面对数组进行洗牌以获得完全不同的项目(不是所有的时间,因为它只是随机的):

In [149]: def rand_choos(arr):
     ...:     arr = arr[:] # this creates a copy for preventing the function to change the array globally
     ...:     random.shuffle(arr)
     ...:     (f1, f2) = random.sample(arr, 1)[0]
     ...:     second = next((i, j) for i, j in arr if i != f1 and j != f2)
     ...:     return (f1, f2), second
     ...: 

In [150]: rand_choos(lst)
Out[150]: (('B', 3), ('G', 1))

In [151]: rand_choos(lst)
Out[151]: (('B', 3), ('A', 1))