2016-09-14 5 views
-1

Ich habe 2 Listen der Wörterbücher, die wie folgt aussehen:Zwei Listen von JSON-Werte - tun Betrieb auf einige Schlüssel

x = [{'id':1,'num':5,'den':8}, 
    {'id':2,'num':3,'den':5}, 
    {'id':4,'num':11,'den':18}, 
    {'id':3,'num':2,'den':81}, 
    {'id':7,'num':10,'den':33}] 

y = [{'id':1,'num':4,'den':9}, 
    {'id':6,'num':5,'den':11}, 
    {'id':3,'num':13,'den':83}, 
    {'id':2,'num':15,'den':28}, 
    {'id':4,'num':1,'den':2}] 

Jetzt, da klar ist, sowohl die Schlüssel in jedem (Artikel) dict von Listen sind gleich. Für diejenigen Elemente, die dieselbe haben id, möchte ich eine neue Liste mit entsprechenden num = num(x) + num(y) und den = den(x) + den(y). In diesem Fall lautet die Ausgabe:

z = [{'id':1,'num':9,'den':17}, 
    {'id':2,'num':18,'den':33}, 
    {'id':4,'num':12,'den':20}, 
    {'id':3,'num':15,'den':164}] 

Wie kann dies auf die "pythonischste" Weise erreicht werden. Soll ich nur Gewalt anwenden?

+0

Ist das eine zufällige downvote? Wie ist das zu weit ... Ich denke nicht, dass ich mit der Frage – vish4071

+1

spezifischer sein könnte Ich war nicht der Downvoter, aber der Grund für den Downvote ist ziemlich offensichtlich. Sie müssen angeben, was Sie versucht haben, und was nicht funktioniert, etc .. (Vor allem für jemanden mit Ihrem Vertreter, etc ..). Vielleicht sollte dies helfen: http://stackoverflow.com/help/how-to-ask – karthikr

+0

@karthikr Derjenige, der downvoted hat die Frage als zu breit markiert, so ist dies nicht der Grund. Ich habe in der Frage erwähnt, dass ich dies tun kann, indem ich es brutal zwinge, aber ich bin mir sicher, dass es bei Python einen einfacheren Weg geben muss. Nichts funktioniert nicht, ich will nur den richtigen Weg wissen. – vish4071

Antwort

1

können Sie erreichen es mit list comprehension als:

>>> [{'id': i['id'], 'num': i['num'] + j['num'], 'den': i['den'] + j['den']} for i in x for j in y if i['id'] == j['id']] 
[{'num': 9, 'id': 1, 'den': 17}, {'num': 18, 'id': 2, 'den': 33}, {'num': 15, 'id': 3, 'den': 164}, {'num': 12, 'id': 4, 'den': 20}] 
+0

Schön. Ich wusste nicht, dass das Listenverständnis so funktionieren könnte, was für sich selbst nisten würde. Danke – vish4071

0

eine irgendwie besser lesbar Lösung:

import collections 
result = collections.defaultdict(lambda: {'num': 0,'den': 0}) 
for data in x + y: 
    match = result[data['id']] 
    match['num'] += data['num'] 
    match['den'] += data['den'] 
    match['id'] = data['id'] 
z = list(result.values()) 
+0

Das wird auch diese Werte haben, in diesem Fall passen 'x [id]' und 'y [id]' nicht zusammen, wie ids 6,7 in meinem Beispiel. Obwohl das nett ist, würde ich das Listenverständnis bevorzugen, da es sich IMO recht gut liest. – vish4071