Python:有条件地从列表中删除元素

Ste*_*joa 9 python list

假设我有一个元组列表:

x = [(1,2), (3,4), (7,4), (5,4)]
Run Code Online (Sandbox Code Playgroud)

在共享第二个元素的所有元组中,我想保留具有最大第一个元素的元组:

y = [(1,2), (7,4)]
Run Code Online (Sandbox Code Playgroud)

在Python中实现这一目标的最佳方法是什么?


谢谢你的回答.

  • 元组可以是两元素列表,如果这有所不同.
  • 所有元素都是非负整数.
  • 我喜欢目前的答案.我应该真正了解更多有关collections提供的内容!

aar*_*ing 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()
Run Code Online (Sandbox Code Playgroud)


Joh*_*ooy 5

类似于亚伦的回答

>>> 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)]
Run Code Online (Sandbox Code Playgroud)

请注意,此方法不会保留订单.要保留订单,请改用它

>>> y = [(k,v) for k,v in x if d[v]==k]
>>> y
[(1, 2), (7, 4)]
Run Code Online (Sandbox Code Playgroud)

这是另一种方式.它使用更多存储空间,但对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)]
Run Code Online (Sandbox Code Playgroud)

同样,一个简单的修改保留了订单

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