0

次のようなリストのリストがあります。

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]]
4

3 に答える 3

1
maxキーで関数を 使用できます。これは、インデックス 3 (z 値) の最大値を持つリストの項目に
maxz = max(list_, key=lambda x: x[3])
割り当てられます。次に、「xi」と「yi」の値を抽出できます。maxzlist_
xi, yi = (maxz[1], maxz[2])

nodesリストを z で 並べ替えたい場合は、関数を:と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値を持つ項目) を取得します。
  • 次に、ループの 2 行目で、このノードを最大ノードのリストに追加します。
于 2013-11-14T18:00:02.200 に答える
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')]
于 2013-11-14T19:58:17.620 に答える