2017-06-16 4 views
1

Wie nehmen Sie die Summe der zwei letzten Spalten, wenn die beiden ersten Spalten übereinstimmen?Summenspalten von Teilen des 2D-Arrays Python

Eingang:

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

Ausgang:

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

und können Sie tun, es ist ein Jota for-Schleife?

+1

Ich denke, Ihre Eingabedaten sind falsch. Ich denke "M [0] [1]" und "M [1] [1]" sollten beide 1 anstatt 2 sein. Das heißt, wenn ich verstehe, was Sie zu tun versuchen. – FamousJameous

+0

sind sie immer korrekt bestellt? Oder könnten 'M [0]' und 'M [-1]' geschaltet werden? – depperm

+0

das ist richtig (FamousJameous), mein schlechtes, tut mir leid .. – newbie1239

Antwort

0

Unter der Annahme, dass zwei ähnliche Listen einander folgen immer konnte man über M[:-1] laufen und dann überprüfen Sie die aktuelle Liste Werte gegen die nächste Liste Werte

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

Wenn der Auftrag würde ich 2 verschlüsselnden verwenden könnte, for Schleifen. Der zweite wird m gegen jede andere Liste nach ihm überprüfen (es muss nicht diejenigen früher überprüfen, da sie dagegen überprüft haben).

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

Wir können die einzigartige Tupel in den ersten beiden Spalten finden und dann über jene iterieren die Summe jeder Spalte, der Reihen gleich das Tupel zu finden.

nicht sicher, was die schnellste Lösung ist, aber das ist eine Option:

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

Eine Lösung mit Liste Verständnis und itertools 'groupby:

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

Ergebnis:

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

Mit reduce kann es vereinfacht werden:

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])) 
]) 
Verwandte Themen