我有一个列表,例如:
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 :(得分:1)
max
功能与键一起使用:maxz = max(list_, key=lambda x: x[3])
maxz
分配给列表list_
的项目,其最大值为索引3(z值)。然后,您可以提取`xi`和`yi`值:xi, yi = (maxz[1], maxz[2])
德尔>
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
。