【问题标题】:Finding unique maximum values in a list using python使用python在列表中查找唯一的最大值
【发布时间】:2010-03-12 16:45:25
【问题描述】:

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

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 中做到这一点?

谢谢

【问题讨论】:

  • 抱歉,请您重新措辞一下好吗?我不明白为什么你只是从初始列表中删除第一个项目,即使它的 y 值高于第一个返回的项目......
  • 问题不是很清楚,什么是唯一最大值?这是数学某个分支中的一个既定概念吗?还是您想出一个术语来描述您的问题?

标签: python set unique


【解决方案1】:

例如:

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 列表作为值来构建一个字典,然后最后一次传递那个以选择每个(x, y) 的最大值z,但我认为排序-and-group 方法更可取(除非您有数百万个点,因此排序的大 O 性能担心您出于可伸缩性目的,我猜)。

【讨论】:

  • 谢谢 Alex,不,我不熟悉 itertools,但我很快就会熟悉。再次感谢,非常感谢您的宝贵时间
  • 由于您已经在使用operator 模块,您可以跳过getxy 函数并使用operator.itemgetter(slice(0,2)) 作为键。没有理由 Python-C-Python 往返。
【解决方案2】:

您可以使用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()]

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

【讨论】:

    【解决方案3】:

    如果我理解你的问题.. 可以使用字典将 (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
    

    虽然订单会丢失

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-02
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 2019-03-17
      相关资源
      最近更新 更多