Zusammenführen Wörterbuch-Wert-Listen in python
Ich versuche die Zusammenlegung von drei Wörterbücher, die alle den gleichen Schlüssel besitzen, und entweder Listen von Werten, oder einzelne Werte.
one={'a': [1, 2], 'c': [5, 6], 'b': [3, 4]}
two={'a': [2.4, 3.4], 'c': [5.6, 7.6], 'b': [3.5, 4.5]}
three={'a': 1.2, 'c': 3.4, 'b': 2.3}
Was ich brauche, ist für alle Gegenstände im Werte addiert werden zu einer Liste zusammen.
result={'a': [1, 2, 2.4, 3.4, 1.2], 'c': [5, 6, 5.6, 7.6, 2.3], 'b': [3, 4, 3.5, 4.5, 3.4]}
Ich habe versucht, verschiedene Dinge, aber die meisten setzen die Werte in verschachtelten Listen.
E. g.
out=dict((k, [one[k], two.get(k), three.get(k)]) for k in one)
{'a': [[1, 2], [2.4, 3.4], 1.2], 'c': [[5, 6], [5.6, 7.6], 3.4], 'b': [[3, 4], [3.5, 4.5], 2.3]}
Ich versuchte eine Aktualisierung, indem die Schleife durch die Werte:
out.update((k, [x for x in v]) for k,v in out.iteritems())
aber das Ergebnis war genau das gleiche.
Ich habe versucht, fügen Sie einfach die Listen, aber da das Dritte Wörterbuch hat nur ein schweben, ich konnte es nicht tun.
check=dict((k, [one[k]+two[k]+three[k]]) for k in one)
Also habe ich versucht, fügen Sie zunächst die Listen in Werte von eins und zwei, und dann hängen Sie den Wert von drei. Hinzufügen der Listen funktionierte gut, aber dann, wenn ich versuchte, fügen Sie den Schwimmer aus den Dritten Wörterbuch, plötzlich der ganze Wert ging auf 'None'
check=dict((k, [one[k]+two[k]]) for k in one)
{'a': [[1, 2, 2.4, 3.4]], 'c': [[5, 6, 5.6, 7.6]], 'b': [[3, 4, 3.5, 4.5]]}
new=dict((k, v.append(three[k])) for k,v in check.items())
{'a': None, 'c': None, 'b': None}
InformationsquelleAutor branwen85 | 2014-11-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als ein one-liner, mit einem Wörterbuch Verständnis:
Dies schafft neue Listen, die Verkettung der Liste aus
one
mit der entsprechenden Liste vontwo
setzen die einzelnen Wert inthree
in eine temporäre Liste, um die Verkettung einfacher.Oder mit einem
for
Schleife aktualisierenone
-Ort:Diese verwendet
list.extend()
zu aktualisieren, original-Liste in-place mit der Liste vontwo
, undlist.append()
zum hinzufügen einzelner Wert austhree
.Wo Sie ging schief:
Ihrem ersten Versuch erstellt eine neue Liste mit den Werten aus
one
,two
undthree
verschachtelt ist eher als Verkettung der vorhandenen Listen. Der Versuch zu reinigen, bis nur kopiert bei den verschachtelten Listen über.Ihrem zweiten Versuch hat nicht funktioniert, weil der Wert in
three
ist nicht eine Liste konnte also nicht verkettet werden. Ich habe eine neue Liste nur für diesen einen Wert.Ihren letzten Versuch sollte nicht verwendet werden
list.append()
in eine generator expression, denn Sie speichern die Rückgabewert, Methode, der ist immerNone
(sein Wechsel ist gespeichert inv
direkt und die Liste muss nicht wieder zurück).Demo-der erste Ansatz:
Ich arbeite an einem ähnlichen problem und das war sehr hilfreich.
InformationsquelleAutor Martijn Pieters
Finden Sie in dieser Hilfe oder nicht:
InformationsquelleAutor HBS
Beliebigen Wörterbuch-Nummer und-Tasten
Die Probleme mit dem Versuch abgedeckt sind @MartijnPieters' Lösung.
Für eine generalisierte Lösung, erwägen Sie die Verwendung
itertools.Kette
zur Kette mehrere Wörterbücher. Sie können auch eindefaultdict
für den allgemeineren Fall, wo Sie nicht finden, die gleichen Schlüssel, die in jedem Wörterbuch.Hinweis
defaultdict
ist eine Unterklasse vondict
so gibt es in der Regel keine Notwendigkeit, zu konvertieren das Ergebnis in eine reguläredict
.InformationsquelleAutor jpp