Python:按条件删除列表元素
假设我有一个包含元组的列表:
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)]