我有一个点列表,如下所示
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中做到这一点?
由于
答案 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
虽然订购将会丢失