2017-06-16 65 views
1

如果兩個第一列匹配,如何獲得最後兩列的總和?二維數組部分的彙總列表Python

輸入:

M = [[1,1,3,5], 
     [1,1,4,6], 
     [1,2,3,7], 
     [1,2,6,6], 
     [2,1,0,8], 
     [2,1,3,5], 
     [2,2,9,6], 
     [2,2,3,4]] 

輸出:

M = [[1,1,7,11], 
    [1,2,9,13], 
    [2,1,3,13], 
    [2,2,12,10]] 

,你可以做到這一點絲毫for循環?

+1

我認爲你的輸入數據是錯誤的。我認爲'M [0] [1]'和'M [1] [1]'應該都是1而不是2。也就是說,如果我理解你正在嘗試做什麼。 – FamousJameous

+0

他們是否總是正確訂購?或者可以切換M [0]和M [-1]? – depperm

+0

這是正確的(FamousJameous),我的壞,對不起.. – newbie1239

回答

0

假設2名類似的名單跟隨對方總是你可以遍歷M[:-1],然後檢查當前列表中值的打擊下列表值

M =[[1,1,3,5],[1,1,4,6],[1,2,3,7],[1,2,6,6],[2,1,0,8],[2,1,3,5],[2,2,9,6],[2,2,3,4]] 
t=[] 
for i,m in enumerate(M[:-1]): 
    if m[0] == M[i+1][0] and m[1]==M[i+1][1]: 
    t.append([m[0],m[1],m[2]+M[i+1][2],m[3]+M[i+1][3]]) 
print(t) 
#[[1, 1, 7, 11], [1, 2, 9, 13], [2, 1, 3, 13], [2, 2, 12, 10]] 

如果訂單可能會擾亂我會使用2 for循環。第二個將檢查m之後的每個其他列表(它不需要在檢查之後檢查它們)。

for i,m in enumerate(M[:-1]): 
    for x,n in enumerate(M[i+1:]): 
    if m[0] == n[0] and m[1]==n[1]: 
     t.append([m[0],m[1],m[2]+n[2],m[3]+n[3]]) 
0

我們可以找到獨特的元組中的前兩列,然後遍歷這些發現,它的行等於元組每列的總和。

不知道最快的解決方案是什麼,但是這是一個選項:

M =[[1,1,3,5],[1,1,4,6],[1,2,3,7],[1,2,6,6],[2,1,0,8],[2,1,3,5],[2,2,9,6],[2,2,3,4]] 

ans = [] 
for vals in list(set((x[0], x[1]) for x in M)): 
    ans.append([vals[0], vals[1], sum(res[2] for res in M if (res[0], res[1]) == vals), sum(res[3] for res in M if (res[0], res[1]) == vals)]) 
0

與列表理解和itertoolsgroupby A液:

from itertools import groupby 

M = [ 
    [1,1,3,5], 
    [1,1,4,6], 
    [1,2,3,7], 
    [1,2,6,6], 
    [2,1,0,8], 
    [2,1,3,5], 
    [2,2,9,6], 
    [2,2,3,4], 
] 

print([ 
    [ 
     key[0], 
     key[1], 
     sum(x[2] for x in group), 
     sum(x[3] for x in group), 
    ] 
    for key, group in [ 
     (key, list(group)) 
     for key, group in groupby(sorted(M), lambda x: (x[0], x[1])) 
    ] 
]) 

結果:

[[1, 1, 7, 11], [1, 2, 9, 13], [2, 1, 3, 13], [2, 2, 12, 10]] 

reduce它可以簡化爲:

from itertools import groupby 
from functools import reduce 

M = [ 
    [1,1,3,5], 
    [1,1,4,6], 
    [1,2,3,7], 
    [1,2,6,6], 
    [2,1,0,8], 
    [2,1,3,5], 
    [2,2,9,6], 
    [2,2,3,4], 
] 

print([ 
    reduce(
     lambda x, y: [y[0], y[1], y[2] + x[2], y[3] + x[3]], 
     group, 
     (0, 0, 0, 0), 
    ) 
    for _, group in groupby(sorted(M), lambda x: (x[0], x[1])) 
])