Erstellen eines dict-Liste von Schlüssel-Wert-Tupeln, während die Aufrechterhaltung der doppelte Schlüssel
Also ich habe da ein Verständnis der Wirkung von:
dict((x.key, x.value) for x in y)
Das problem ist natürlich, dass, wenn es mehrere x.key
s mit dem gleichen Wert, erhalten Sie brach mit der letzten x.value
mit, dass insbesondere x.key
als der einzige überlebende. Ich möchte eigentlich die Werte der resultierenden dict eine Liste:
{
'key1': ['value1'],
'key2': ['value2', 'value3', 'value4'],
'key3': ['value5'],
# etc.
}
Ist diese Logik möglich, mit einem Verständnis?
InformationsquelleAutor Chris Pratt | 2011-07-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die Elemente eines nach dem anderen ein Wörterbuch mit leeren Listen standardmäßig:
Können Sie auch etwas tun, sehr ähnlich, ohne das Sammlungen-Modul:
aber das ist wohl etwas weniger gut lesbar.
Einen gleichwertigen, besser lesbar (keine Notwendigkeit, Sie zu "analysieren" die weniger Häufig
setdefault
), aber mehr Fußgänger -, Basis-Python-Ansatz:Die erste Lösung ist eindeutig vorzuziehen, da es gleichzeitig übersichtlich, gut lesbar und schnell.
setdefault
nichtset_default
. Anyways, ich denke, beide Methoden sind gleichermaßen lesbar, ehrlich, also es ist wirklich darauf an, ob es besser ist eine true-blue dict als ein defaultdict.Sie möchten eine
defaultdict
. Es ist ein first-class -, macht-alles-sonst-die-gleichen, echte ehrliche-to-Güte-Wörterbuch. Kein "sicher zu behandeln", Händeringen. Es ist ein dict mit einem anderen__getitem__
. Diesetdefault
version ist weniger gut für diese Anwendung.Danke für den Tippfehler beheben. Ja, defaultdict behandelt werden können, ziemlich viel wie dict. Das einzige was ich mir vorstellen kann aus der Spitze von meinem Kopf ist, dass jedes Element zugreifen
result_dict[…]
wird, erstellen Sie einen neuen Schlüssel, wenn der Schlüssel nicht vorhanden ist. Die meisten der Zeit, ist dies kein problem, in der Tat.In dieser Anwendung, ich glaube nicht, dass es so sein wird. Ich werde Sie nicht benötigen, um wirklich Zugriff auf den Schlüssel direkt, sondern nur die Iteration über die Menge.
InformationsquelleAutor Eric Lebigot
NÖ. Sie können dies tun, in ein Verständnis.
Aber Sie können
itertools.groupby
.InformationsquelleAutor Stefan Kanev
Ich sage nicht, dass es die richtige Sache zu tun, aber nur aus reiner Neugier..
Können Sie
itertools.groupby
undlambda
es zu tun in einem dict-comprehension, wenn das, was Sie wirklich wollen, zu tun: (wol
ist die Liste der Tupel, die Sie wollen, um einedict
aus:l
durch die-Taste zuerst, wenn Sie wollen, dass es funktioniert.groupby()
erfordert die Tasten sortiert, wenn Sie wollen, dass es funktioniert, wie Sie wollen.Ich sehe, dass jetzt, oh gut, es war nur die Neugier sowieso!
Ich upvote weil ich Erstens glaube, dass Ihr Ausdruck war falsch, aber ich erkannte, dass es OK ist. Ich habe anscheinend immer noch nicht Meister groupby - Führung / Instandhaltung. Obwohl diese Lösung mit groupby ist nicht der bessere für dieses problem IMO.
Die 'funktionale Programmierung' - version von der Lösung mit groupby:
dict(map(lambda (k,g): (k,map(itemgetter(1),tuple(g))) ,groupby(sorted(map(lambda x: (x.key, x.value), y)),key=itemgetter(0))))
Autsch !InformationsquelleAutor Hoons