繁体   English   中英

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

[英]how to get items in a list of tuple based on the value in tuple

我得到了一个组合的数据列表,并使用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)]

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

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]

使用列表理解:

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])]

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

>>> 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))])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM