2013-11-14 82 views
0

最大Z值我有名單,如名單:(X,Y)對在列表

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]] 
+0

你應該在我認爲的第一個循環內初始化'maxz'。它不會回答你的問題,但我不確定你現在的解決方案是否有效。 –

+0

是的,你是對的!但在我的情況下,它的作品,因爲馬克斯總是相同:) – jpcgandre

回答

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)),而不是nodesgroupby

+0

如果他們沒有分組它不起作用。如果他們是有用的。我現在的問題是:如何分組這個列表:'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']] – jpcgandre

+1

@jpcgandre你在最後嘗試了這個建議嗎? –

1
您可以使用max功能一鍵:
maxz = max(list_, key=lambda x: x[3])
這將分配maxz到列表01的項目與索引3(z值)的最大值。然後,您可以提取`xi`和`yi`值:
xi, yi = (maxz[1], maxz[2])

如果要排序的nodes清單按Z,你可以連同key使用sorted功能:
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

這將給你一個絕對最大值。結果應該是按(x,y)分組的(x,y,z)列表。 – Matthias

+0

我需要建立'list_'作爲具有相同'x,y'座標的列表。我認爲我可以使用我的'z_levels'列表。我會盡力。 – jpcgandre

+0

這不會做我想要的。如果節點= [['1','1','1','2'],['2','1','1','3'],['3','0' '0','1'],['4','0','0','4']]''然後我得到[[''4','0','0','4'] ['2','1','1','3'],['1','1','1','2'],['3','0','0',' '1']]''但我想'[[''0','0','4'],['1','1','3']] ... ... – jpcgandre

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')] 
+0

什麼是'x'?謝謝 – jpcgandre

+0

@jpcgandre感謝您指出錯誤。修改了代碼。 – shantanoo