Python:按条件删除列表元素

9 投票
5 回答
2140 浏览
提问于 2025-04-16 06:39

假设我有一个包含元组的列表:

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

在所有第二个元素相同的元组中,我想保留第一个元素最大的那个元组:

y = [(1,2), (7,4)]

在Python中,怎么做这个比较好呢?


谢谢大家的回答。

  • 如果元组改成两个元素的列表,是否会有不同的结果。
  • 所有的元素都是非负整数。
  • 我喜欢现在的回答。我真的应该多了解一下collections能提供什么!

5 个回答

2

如果你可以假设在原始列表 x 中,第二个元素相同的元组是连续出现的,那么你可以使用 itertools.groupby 来处理这些数据:

import itertools
import operator

def max_first_elem(x):
    groups = itertools.groupby(x, operator.itemgetter(1))
    y = [max(g[1]) for g in groups]
    return y

需要注意的是,这样做可以确保分组的顺序(根据元组的第二个元素)被保留下来,如果你希望输出结果保持这种顺序的话。

5

使用 collections.defaultdict

import collections

max_elements = collections.defaultdict(tuple)

for item in x:
    if item > max_elements[item[1]]:
        max_elements[item[1]] = item

y = max_elements.values()
5

和Aaron的回答类似

>>> from collections import defaultdict
>>> x = [(1,2), (3,4), (7,4), (5,4)]
>>> d = defaultdict(int)
>>> for v,k in x:
...   d[k] = max(d[k],v) 
... 
>>> y=[(k,v) for v,k in d.items()]
>>> y
[(1, 2), (7, 4)]

注意,这种方法不会保持顺序。如果想保持顺序,可以用这个方法

>>> y = [(k,v) for k,v in x if d[v]==k]
>>> y
[(1, 2), (7, 4)]

这里还有另一种方法。它会使用更多的存储空间,但调用max的次数更少,所以可能会更快

>>> d = defaultdict(list)
>>> for k,v in x:
...   d[v].append(k)
... 
>>> y = [(max(k),v) for v,k in d.items()]
>>> y
[(1, 2), (7, 4)]

再说一次,简单的修改可以保持顺序

>>> y = [(k,v) for k,v in x if max(d[v])==k]
>>> y
[(1, 2), (7, 4)]

撰写回答