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