假设我有一个元组列表:
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提供的内容!使用 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)
类似于亚伦的回答
>>> 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)