2016-12-15 3 views
1

Guten Tag mit allen,Convert Liste mit Nachschlüssel lexikalisch dict Verständnis

Ich versuche, eine Liste der Länge 2 Artikel zu einem Wörterbuch mit der unten zu konvertieren:

my_list = ["b4", "c3", "c5"] 
my_dict = {key: value for (key, value) in my_list} 

Das Problem ist, Wenn ein Schlüsselvorkommen mehr als eins in der Liste ist, werden nur der letzte Schlüssel und sein Wert beibehalten.

Also in diesem Fall statt

my_dict = {'c': '3', 'c': '5', 'b': '4'} 

ich

my_dict = {'c': '5', 'b': '4'} 

Wie kann ich alle Schlüssel: Wert-Paare, selbst wenn es doppelte Schlüssel. Danke

+7

Was erwarten Sie für 'my_dict ['c']'? –

+0

'für (Schlüssel, Wert) in my_list' sollte nicht funktionieren – MMF

+0

@MMF: warum nicht? Jedes Element in 'Meine_Liste' hat zwei Werte, wenn es wiederholt wird. – DSM

Antwort

1

Für einen Schlüssel in einem Wörterbuch können Sie nur einen Wert speichern.

Sie können den Wert als Liste auswählen.

{'b': ['4'], 'c': ['3', '5']} 

folgende Code wird das für Sie tun:

new_dict = {} 
for (key, value) in my_list: 
    if key in new_dict: 
     new_dict[key].append(value) 
    else: 
     new_dict[key] = [value] 
print(new_dict) 
# output: {'b': ['4'], 'c': ['3', '5']} 

gleiche kann mit setdefault erfolgen. Dank @Aadit M Shah es für den Hinweis auf

new_dict = {} 
for (key, value) in my_list: 
    new_dict.setdefault(key, []).append(value) 
print(new_dict) 
# output: {'b': ['4'], 'c': ['3', '5']} 

gleiche kann mit defaultdict erfolgen. Danke @MMF für das Aufzeigen.

from collections import defaultdict 
new_dict = defaultdict(list) 
for (key, value) in my_list: 
    new_dict[key].append(value) 
print(new_dict) 
# output: defaultdict(<class 'list'>, {'b': ['4'], 'c': ['3', '5']}) 

Sie können auch wählen Sie den Wert als eine Liste von Wörterbüchern zu speichern:

[{'b': '4'}, {'c': '3'}, {'c': '5'}] 

folgende Code wird das für Sie tun

new_list = [{key: value} for (key, value) in my_list] 
+1

mit 'defaultdict' brauchst du nicht zu prüfen, ob ein Schlüssel im Dictionary ist;) – MMF

+1

@MMF keine Unstimmigkeit da. –

+1

Noch besser, einfach 'new_dict.setdefault (key, []). Append (value)'. –

0

Sie defaultdict verwenden können, um zu vermeiden, wenn die Überprüfung ein Schlüssel ist im Wörterbuch oder nicht:

from collections import defaultdict 

my_dict = defaultdict(list) 
for k, v in my_list: 
    my_dict[k].append(v) 
Ausgabe

:

defaultdict(list, {'b': ['4'], 'c': ['3', '5']}) 
+0

Noch besser, einfach 'my_dict.setdefault (k, []). Append (v)' mit einem normalen Wörterbuch. –

0

Wenn Sie nicht über das O(n^2) Asymptotik egal können Sie ein dict Verständnis einschließlich einer Liste Verständnis verwenden:

>>> {key: [i[1] for i in my_list if i[0] == key] for (key, value) in my_list} 
{'b': ['4'], 'c': ['3', '5']} 

oder iteration_utilities.groupedby Funktion (die könnte noch schneller sein als mit collections.defaultdict):

>>> from iteration_utilities import groupedby 
>>> from operator import itemgetter 
>>> groupedby(my_list, key=itemgetter(0), keep=itemgetter(1)) 
{'b': ['4'], 'c': ['3', '5']} 
Verwandte Themen