(x,y)对列表中的最大z值

时间:2013-11-14 17:54:51

标签: python list max

我有一个列表,例如:

nodes =[[nodeID,x,y,z],....]

我想找到:

xi,yi for zi=zmax given zmax= max z for same x,y

并将(xi,yi,zi)存储在另一个列表中。

我可以这样做:

nodes=[[literal_eval(x) for x in item] for item in nodes]
maxz_levels=[]
for i,row in enumerate(nodes):
    fe=0
    maxz=0
    nodeID,x,y,z=row
    for j,line in enumerate(nodes):
        nodeID2,x2,y2,z2=line
        if x==x2 and y==y2 and z2>maxz:
            maxz=z2
    if len(maxz_levels)==0:
        maxz_levels.append([x, y, maxz])
    else:
        for row2 in maxz_levels:
            if row2[0]==x and row2[1]==y:
                fe=1
        if fe==0:
            maxz_levels.append([x, y, maxz])

但需要很长时间......所以我想过使用字典,但我找不到一个简单的方法来做我想要的事情。我的代码是:

dic1=defaultdict(list)             
for nodeID,x,y,z in nodes:
    dic1[(x,y)].append((nodeID,z))
for key in dic1:
    dic1[key].sort( key=lambda x:float(x[1]) )
for j,row in enumerate(nodes):
    nodeID,x,y,z=row
    z_levels=[item[1] for item in dic1[(x,y)]]
    #How to find easily and quickly the max of z_levels and the associated (x,y) coordinates?

有什么想法吗?感谢

编辑: 例如:

nodes = [['1','1','1','2'],['2','1','1','3'],['3','0','0','5'],['4','0','0','4'],['5','1','2','4'],['6','0','0','40'],['7','0','10','4'],['8','10','0','4'],['9','0','0','4'],['10','2','1','4']]

我想找到:

maxz_levels = [[1, 1, 3], [0, 0, 40], [1, 2, 4], [0, 10, 4], [10, 0, 4], [2, 1, 4]]

3 个答案:

答案 0 :(得分:1)

<德尔> 您可以将max功能与键一起使用:
maxz = max(list_, key=lambda x: x[3])
这会将maxz分配给列表list_的项目,其最大值为索引3(z值)。然后,您可以提取`xi`和`yi`值:
    xi, yi = (maxz[1], maxz[2])
<德尔> 如果您想按z对nodes列表进行排序,可以将sorted功能与key一起使用:
    maxz_levels = sorted(nodes, key=lambda x: x[3], reverse=True) 然后删除第一个项目。

<小时/> 好吧,我想我终于得到了你的问题。所以这是一次功能尝试:

maxz_levels = []
for i in set([(i[1], i[2]) for i in nodes]):
    m = sorted(filter(lambda x: x[1] == i[0] and x[2] == i[1], nodes))[-1]
    maxz_levels.append((m[1], m[2], m[3]))

说明:

  • for循环遍历(x, y)
  • 中所有nodes组合的列表
  • 循环中的第一行将nodes中所有项目的列表与(x, y)值的当前z值进行排序,并选取最后一个(最大的z值。 {1}}值)。
  • 然后,循环中的第二行将此节点添加到最大节点列表中。

答案 1 :(得分:1)

#!/usr/bin/env python3


nodes = [['1','1','1','2'],['2','1','1','3'],['3','0','0','5'],['4','0','0','4']]

d = {}

for z in nodes:
    x = (z[1], z[2])
    if x not in d:
        d[x] = z[3]
    elif d[x] < z[3]:
        d[x] = z[3]

output = []
for x in d:
    output.append(x+(d[x],))
print(output)

输出:

[('0', '0', '5'), ('1', '1', '3')]

答案 2 :(得分:1)

如果你的商品是由你的X和Y订购的,那么:

from itertools import groupby
from operator import itemgetter

nodes = [['1','1','1','2'],['2','1','1','3'],['3','0','0','5'],['4','0','0','4']]    
result = [max(g, key=itemgetter(3))[1:] for k, g in groupby(nodes, itemgetter(1, 2))]
# [['1', '1', '3'], ['0', '0', '5']]

否则,您可以向sorted(nodes, key=itemgetter(1, 2))提供nodes而不是groupby