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

Python 列表中最大z值的(x,y)对,python,list,max,Python,List,Max,我有一个列表,例如: nodes =[[nodeID,x,y,z],....] 我想找到: xi,yi for zi=zmax given zmax= max z for same x,y maxz_levels = [[1, 1, 3], [0, 0, 40], [1, 2, 4], [0, 10, 4], [10, 0, 4], [2, 1, 4]] 并将(xi,yi,zi)存储在另一个列表中 我可以使用以下方法进行此操作: nodes=[[literal_eval(x) for x

我有一个列表,例如:

nodes =[[nodeID,x,y,z],....]
我想找到:

xi,yi for zi=zmax given zmax= max z for same x,y
maxz_levels = [[1, 1, 3], [0, 0, 40], [1, 2, 4], [0, 10, 4], [10, 0, 4], [2, 1, 4]]
并将
(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?
有什么想法吗?谢谢

编辑: 例如:

我想找到:

xi,yi for zi=zmax given zmax= max z for same x,y
maxz_levels = [[1, 1, 3], [0, 0, 40], [1, 2, 4], [0, 10, 4], [10, 0, 4], [2, 1, 4]]
您可以使用带有键的
max
功能:
maxz=max(列表,键=lambda x:x[3])

这将使用索引3(z值)的最大值将
maxz
分配给列表中的项目
list
。然后可以提取'xi'和'yi'值:
xi,yi=(maxz[1],maxz[2])

如果要按z对
节点
列表进行排序,可以使用
排序
功能和

maxz_levels=sorted(节点,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)
    组合的列表
  • 循环中的第一行按
    z
    值对当前
    (x,y)
    值的
    节点中所有项的列表进行排序,并取最后一行(z
    值最大的一行)
  • 然后循环中的第二行将此节点添加到最大节点列表中
您可以使用带有键的
max
功能:
maxz=max(列表,键=lambda x:x[3])

这将使用索引3(z值)的最大值将
maxz
分配给列表中的项目
list
。然后可以提取'xi'和'yi'值:
xi,yi=(maxz[1],maxz[2])

如果要按z对
节点
列表进行排序,可以使用
排序
功能和

maxz_levels=sorted(节点,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)
    组合的列表
  • 循环中的第一行按
    z
    值对当前
    (x,y)
    值的
    节点中所有项的列表进行排序,并取最后一行(z
    值最大的一行)
  • 然后循环中的第二行将此节点添加到最大节点列表中
您可以使用带有键的
max
功能:
maxz=max(列表,键=lambda x:x[3])

这将使用索引3(z值)的最大值将
maxz
分配给列表中的项目
list
。然后可以提取'xi'和'yi'值:
xi,yi=(maxz[1],maxz[2])

如果要按z对
节点
列表进行排序,可以使用
排序
功能和

maxz_levels=sorted(节点,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)
    组合的列表
  • 循环中的第一行按
    z
    值对当前
    (x,y)
    值的
    节点中所有项的列表进行排序,并取最后一行(z
    值最大的一行)
  • 然后循环中的第二行将此节点添加到最大节点列表中
您可以使用带有键的
max
功能:
maxz=max(列表,键=lambda x:x[3])

这将使用索引3(z值)的最大值将
maxz
分配给列表中的项目
list
。然后可以提取'xi'和'yi'值:
xi,yi=(maxz[1],maxz[2])

如果要按z对
节点
列表进行排序,可以使用
排序
功能和

maxz_levels=sorted(节点,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)
    组合的列表
  • 循环中的第一行按
    z
    值对当前
    (x,y)
    值的
    节点中所有项的列表进行排序,并取最后一行(z
    值最大的一行)
  • 然后循环中的第二行将此节点添加到最大节点列表中

如果您的物品由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']]

否则,您可以将
排序(节点,key=itemgetter(1,2))
而不是
节点
提供给
groupby

,如果项目是按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']]

否则,您可以将
排序(节点,key=itemgetter(1,2))
而不是
节点
提供给
groupby

,如果项目是按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']]

否则,您可以将
排序(节点,key=itemgetter(1,2))
而不是
节点
提供给
groupby

,如果项目是按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']]

否则,您可以向
groupby

提供
sorted(nodes,key=itemgetter(1,2))
而不是
nodes
,我认为您应该在第一个循环中初始化
maxz
。它不会回答您的问题,但我不确定您当前的解决方案是否有效。是的,您是对的!但在我的例子中,它是有效的,因为maxz总是相同的:)您应该在