从列表中获取每个键的最大值元组

3 投票
4 回答
3599 浏览
提问于 2025-04-17 03:18

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

[(1, 0), (2, 1), (3, 1), (6, 2), (3, 2), (2, 3)]

我想保留那些具有相同第二个值的元组中,第一个值最大的元组。比如说,(2, 1)(3, 1) 这两个元组的第二个值是一样的,所以我只想保留第一个值最大的那个,也就是 (3, 1)。最后我想得到这样的结果:

[(1, 0), (3, 1), (6, 2), (2, 3)]

我不在乎这是不是一行代码完成的,但我想知道有没有什么高效的方法来实现这个...

4 个回答

0

在编程中,有时候我们需要让程序做一些重复的事情,比如计算、处理数据等等。为了让这些重复的操作变得简单,我们可以使用“循环”。循环就像是一个指令,让程序不停地执行某些代码,直到满足特定条件为止。

想象一下,你在做数学题,老师让你把1加到10。你可以一个一个地加,也可以用循环来自动完成这个任务。这样,你只需要告诉程序从1加到10,而不需要每次都手动加,这样就省时省力了。

循环有几种类型,比如“for循环”和“while循环”。“for循环”适合当你知道要重复多少次的时候,而“while循环”则适合当你不知道要重复多少次,只要满足某个条件就继续执行。

总之,循环是编程中非常重要的一个概念,它可以帮助我们更高效地完成任务,让代码更加简洁易懂。

import itertools
import operator
l = [(1, 0), (2, 1), (3, 1), (6, 2), (3, 2), (2, 3)]
result = list(max(v, key=operator.itemgetter(0)) for k, v in itertools.groupby(l, operator.itemgetter(1)))
4

可能可以用一个字典来实现:

rd = {}
for V,K in my_tuples:
  if V > rd.setdefault(K,V):
    rd[K] = V
result = [ (V,K) for K,V in rd.items() ]
6
from operator import itemgetter
from itertools import groupby

[max(items) for key, items in groupby(L,key = itemgetter(1))]

这里假设你最开始的元组列表是按照键值排序的。

groupby 会创建一个迭代器,它会生成一些对象,比如 (0, <itertools._grouper object at 0x01321330>),其中第一个值是键值,第二个值是另一个迭代器,这个迭代器会提供所有带有这个键的元组。

max(items) 只是选择具有最大值的元组,因为这个组的所有第二个值都是相同的(而且也是键),所以它会给出第一个值最大的元组。

使用列表推导式来根据这些函数的输出形成一个元组的输出列表。

撰写回答