如何基于元组中的值获取元组列表中的项目

时间:2018-09-09 23:39:47

标签: python list sorting lambda tuples

我得到一个组合的数据列表,并使用zip函数对其进行了排序

comb_list = sorted(zip(score_list, move_list), key = lambda pair: pair[0], reverse = True)

输出是这样的

a = [(3, (5, 4, False)), (3, (6, 4, False)), (2, (5, 1, False)), 
(1, (6, 2, False)), (-1, (6, 2, False))] 

我想按元组中的第一个元素(在列表中)排序,找到最大值,然后输出元组中的第二个元素。这里的最大值是3,输出将是

[(5, 4, False), (6, 4, False)]

或者如果我有

a = [(3, (5, 4, False)), (2, (5, 1, False)), (1, (6, 2, False)), (-1, (6, 2, False))] 

输出将是

[(5, 4, False)]

3 个答案:

答案 0 :(得分:2)

比对整个列表进行排序然后过滤,还有更有效的方法,但是由于您已经按关键字对整个列表进行了排序,并且大概了解了它的工作原理,所以让我们从这里开始:

a = [(3, (5, 4, False)), (3, (6, 4, False)), (2, (5, 1, False)), (1, (6, 2, False)), (-1, (6, 2, False))] 

所以现在,您只想对键与顶部键相同的键进行过滤:

b = [(key, value) for key, value in a if key == a[0][0]]

…,除了您只想要value,而不是(key, value)对,这很简单:

b = [value for key, value in a if key == a[0][0]]

现在,为什么效率低下?好吧,如果您已经对列表进行了排序,则实际上不需要检查每个值;您可以在找到不匹配的内容后立即退出循环(例如,使用itertools.takewhile)。但是,更简单地说,您不需要首先进行排序;只需获取max,然后使用它进行过滤:

comb_list = list(zip(score_list, move_list))
comb_max = max(comb_list, key=lambda pair: pair[0])
b = [value for key, value in comb_list if key==comb_max[0]]

或者,甚至更好的是,您甚至不需要构建中间列表,因为max首先不需要zip。这也使事情更容易理解:

max_score = max(score_list)
b = [move for score, move in zip(score_list, move_list) if score == max_score]

答案 1 :(得分:-1)

使用列表理解:

a = [(5, (5, 4, False)), (3, (6, 4, False)), (2, (5, 1, False)),(1, (6, 2, False)), (-1, (6, 2, False))]
filtered = [p[1] for p in a if p[0] >= max([x[0] for x in a])]

答案 2 :(得分:-3)

一种非常简单且Python化的解决方法

>>> max_value = max(a, key=lambda x:x[0])[0]
>>> max_value
3
>>> [x[1] for x in a if x[0]==max_value]
[(5, 4, False), (6, 4, False)]

您可以通过key使用最大内置方法:

 >>> a = [(3, (5, 4, False)), (3, (6, 4, False)), (2, (5, 1, False)),
... (1, (6, 2, False)), (-1, (6, 2, False))]
>>> max([(x,list(y)) for x,y in itertools.groupby(sorted(a, key=lambda x:x[0]), key=lambda x:x[0])], key=lambda x:x[0])
(3, [(3, (5, 4, False)), (3, (6, 4, False))])