使用python在列表中查找唯一的最大值

时间:2010-03-12 16:45:25

标签: python set unique

我有一个点列表,如下所示

points=[ [x0,y0,v0],  [x1,y1,v1],  [x2,y2,v2].......... [xn,yn,vn]]

某些点具有重复的x,y值。我想要做的是提取唯一的最大值x,y点

例如,如果我有点[1,2,5] [1,1,3] [1,2,7] [1,7,3]

我想获取列表[1,1,3] [1,2,7] [1,7,3]

我怎么能在python中做到这一点?

由于

3 个答案:

答案 0 :(得分:8)

例如:

import itertools

def getxy(point): return point[:2]

sortedpoints = sorted(points, key=getxy)

results = []

for xy, g in itertools.groupby(sortedpoints, key=getxy):
  results.append(max(g, key=operator.itemgetter(2)))

即:按xy对点进行排序和分组,对于每个具有固定xy的组,选择具有最大z的点。如果你对itertools感到满意,那似乎很简单(你应该这样,它真的是一个非常强大和有用的模块!)。

或者,您可以构建一个以(x,y)元组作为键和z列表作为值的dict,并对该值进行最后一次传递,为每个{{1}选择最大z但是我认为排序和组方法更可取(除非你有数百万个点,所以排序的大O性能会让你担心可扩展性,我猜)。

答案 1 :(得分:0)

您可以使用dict来实现此目的,使用property“如果多次看到给定的键,则与其关联的最后一个值将保留在新词典中。”此代码对点进行排序以确保最高值出现在后面,创建一个字典,其键是前两个值的元组,其值是第三个坐标,然后将其转换回列表

points = [[1,2,5], [1,1,3], [1,2,7], [1,7,3]]
sp = sorted(points)
d = dict( ( (a,b), c) for (a,b,c) in sp)
results = [list(k) + [v] for (k,v) in d.iteritems()]

可能有一种方法可以进一步改进,但它可以满足您的所有要求。

答案 2 :(得分:0)

如果我理解你的问题......可能会使用字典将(x,y)映射到最大z

类似的东西(未经测试)

dict = {}
for x,y,z in list
    if dict.has_key((x,y)):
        dict[(x,y)] = max(dict[(x,y)], z)
    else:
        dict[(x,y)] = z

虽然订购将会丢失