我有一个dict列表,我想删除所有具有相等x值的对象,保持y max值和列表顺序。我做了以下代码:
#!/usr/bin/python3
from pprint import pprint
import operator
lst = [{'x': 207, 'y': 40}, {'x': 207, 'y': 45}, {'x': 254, 'y': 62}, {'x': 260, 'y': 26}, {'x': 351, 'y': 71}, {'x': 351, 'y': 5}, {'x': 351, 'y': 15}, {'x': 391, 'y': 24}, {'x': 391, 'y': 48}]
pprint(lst)
[{'x': 207, 'y': 40},
{'x': 207, 'y': 45},
{'x': 254, 'y': 62},
{'x': 260, 'y': 26},
{'x': 351, 'y': 71},
{'x': 351, 'y': 5},
{'x': 351, 'y': 15},
{'x': 391, 'y': 24},
{'x': 391, 'y': 48}]
copy = []
[
copy.append(max(
(point2 for point2 in lst if point["x"] == point2["x"]),
key=operator.itemgetter('y'))
)
for point in lst
if next(
(cPoint for cPoint in copy if cPoint['x'] == point['x']),
None) == None
]
pprint(copy)
[{'x': 207, 'y': 45},
{'x': 254, 'y': 62},
{'x': 260, 'y': 26},
{'x': 351, 'y': 71},
{'x': 391, 'y': 48}]
我只是问是否有更优雅(和Pythonic)的方式来做这件事?
提前致谢
答案 0 :(得分:2)
如何:首先创建一个字典,其中包含每个y
的最大x
值,然后保留列表中具有最高y
值的字段x
maxima = {}
for d in lst:
x, y = d["x"], d["y"]
if x not in maxima or y > maxima[x]:
maxima[x] = y
copy = [d for d in lst if d["y"] == maxima[d["x"]]]
1}}。
{{1}}
答案 1 :(得分:2)
除了tobias_k's answer之外,这里还有一个更具功能性的风格。首先,我们将lst
的所有元素按其x
值分组,然后,对于每个组,我们得到具有最大y
的元素。之后,我们可以浏览lst
的所有元素并检查它是否在最大值列表中。如果是,请将其放入copy
:
import itertools
getx, gety = lambda a: a['x'], lambda a: a['y'] # or use operator.itemgetter
groups = itertools.groupby(sorted(lst, key=getx), key=getx)
m = [max(b, key=gety) for a,b in groups]
copy = [l for l in lst if l in m]