如何从元组列表的一部分中提取随机元素?

时间:2021-06-01 06:32:45

标签: python list tuples

我有一个像这样的元组列表:

[(6, 1), (7, 1), (1, 2), (3, 2), (5, 2), (2, 4), (4, 4)]

我已经根据第二个元素对它进行了排序,如果您看到前两个元组 (6,1) 和 (7,1) 都为 1,我想从其中包含的元组中选择一个随机元组共同的第二个元素并在第一个位置,所以在这种情况下,在第二个位置有 1 的那个。

2 个答案:

答案 0 :(得分:2)

您可以使用itertools.groupby()

>>> import random
>>> import itertools
>>> l = [(6, 1), (7, 1), (1, 2), (3, 2), (5, 2), (2, 4), (4, 4)]
>>> for item in itertools.groupby(l, lambda k: k[1]):
...     print(random.choice(list(item[1])))
...
(6, 1)
(5, 2)
(4, 4)

这假设列表已排序(如您的问题所述)。

如果你只想要第一个元素,你可以使用

random.choice(list(next(itertools.groupby(l, lambda k: k[1]))[1]))

(实际上,这是非常不可读的,所以我将其分解:)

random.choice(  # select a random item
 list(          # from the list of results
  next(         # of the first group
   itertools.groupby(l, lambda k: k[1]) # grouped by the second number in the tuple
  )
  [1]           # use the second element of that list (the first is the key)
 )

答案 1 :(得分:1)

即使问题已经得到解答,这里还是一个不使用 itertools 的解决方案:

import random

L = [(6, 1), (7, 1), (1, 2), (3, 2), (5, 2), (2, 4), (4, 4)]

G = list(set([ x[1] for x in L ]))

for g in G:
    l = [ x for x in L if x[1] == g ]
    print (l[random.randint(0,len(l)-1)])

输出:

(7, 1)
(1, 2)
(4, 4)