2017-06-21 2 views
-1

In Python, wie konvertiere ich eine Liste, die Zeichenfolgen und Listen enthält, die zwei Werte in einem Wörterbuch haben, so dass der Schlüssel die Zeichenfolge und der Wert eine Liste von Listen ist Der erste Wert jeder Liste ist der Schlüssel.Konvertieren einer Liste von Str und Listen in dict

Zum Beispiel die aktuelle Liste ich habe, ist:

['A', ['A', 1], 'B', ['B',1], ['B',2], 'C', ['C', 1], ['C',2], ['C',3]] 

und ich möchte das Wörterbuch:

{'A': [['A', 1]], 'B': [['B',1], ['B',2]], 'C': [['C',1], ['C',2], [ 'C', 3]]}

Danke.

EDIT: Die Anzahl der Listen, die einer Zeichenfolge folgen, ist beliebig.

+0

Was haben Sie versucht zu tun? – depperm

+0

Ich habe versucht, ein Wörterbuch mit nur Schlüssel und Anfangswert 0 zu erstellen, aber ich kann mir keine effiziente Möglichkeit vorstellen, das Wörterbuch so zu füllen, wie ich es möchte. –

+0

Bitte teilen Sie den Code, so dass wir Ihnen besser helfen können – gmuraleekrishna

Antwort

2

Damit wird unabhängig von der Reihenfolge der Liste genau das ausgewählt, was Sie suchen.

def new(list_): 
    new_dic = {x:[y for y in list_ if type(y) == list and y[0] == x] for x in list_ if type(x) == str} 
    print(new_dic) 

new(['A', ['A', 1], ['A',2], 'B', ['B',1], ['B',2], 'C', ['C', 1], ['C',2]]) 
0
d = {l: [] for l in mylist if type(l) is str} 

for l in mylist: 
    if type(l) is list: 
     d[l[0]].append(l) 
+0

Die Werte sind eine leere Liste, weil Sie nicht ausgewertet haben, ob der erste Wert der Listen mit dem Schlüssel übereinstimmt. –

+0

Tatsächlich erhalten Sie 'KeyError', wenn der erste Wert der Liste nicht mit einem Schlüssel im Wörterbuch übereinstimmt ... Sie können diese Ausnahme abfangen, wenn nicht bekannt ist, ob alle Listen hinzugefügt werden. –

0

können Sie versuchen, defaultdict

from collections import defaultdict 
my_dict = defaultdict(list) 
my_list = ['A', ['A', 1], ['A',2], 'B', ['B',1], ['B',2], 'C', ['C', 1], ['C',2]] 
for index in my_list: 
    if len(index) > 1: 
     my_dict[index[0]].append(index) 
0

Es scheint, wie es die String-Werte sind in der Liste ist egal, was. Auf Basis der aktuellen Struktur der Liste zur Verfügung gestellt und die erforderlichen Ausgabe, können Sie einfach überprüfen Sie die Listen in der Liste, und durch das defaultdict Konstrukt verwenden, können Sie einfach nur Ihr Wörterbuch entsprechend Handwerk:

from collections import defaultdict 

l = ['A', ['A', 1], 'B', ['B',1], ['B',2], 'C', ['C', 1], ['C',2], ['C',3]] 

d = defaultdict(list) 
for data in l: 
    if type(data) is list: 
     d[data[0]].append(data) 

Ausgang:

defaultdict(<class 'list'>, {'A': [['A', 1]], 'C': [['C', 1], ['C', 2], ['C', 3]], 'B': [['B', 1], ['B', 2]]}) 

so, hier die defaultdict eine Liste als Standard-Ansammlungswert nehmen. Daher wird beim Hinzufügen eines neuen Schlüssels der Standardwert eine Liste sein. Wenn Sie über die Liste iterieren, überprüfen Sie einfach den Typ der Daten in der Liste. Wenn Sie einen list finden, fügen Sie ihn in Ihrem Wörterbuch ein, indem Sie den ersten Wert dieser Liste als Schlüssel verwenden und dann die Liste als Wert anhängen. Es sollte Ihnen die Ausgabe geben, nach der Sie suchen.

+0

Ich bekomme TypeError: das erste Argument muss aufrufbar sein oder keine –

+0

@ Mat.S Ich kopierte den Code in meine Antwort eingefügt und es läuft gut. Welche Eingaben liefern Sie? – idjaw

+0

@ Mat.S Beachten Sie, dass die Liste in defaultdict (Liste) der Standardtyp 'list' ist und keine bereits initialisierte Liste. – rodgdor

Verwandte Themen