删除保持最大值和顺序的对象列表中的重复项

时间:2015-02-13 10:27:54

标签: python list

我有一个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)的方式来做这件事?

提前致谢

2 个答案:

答案 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]