2017-12-15 2 views
5

Indem ich über eine Python-Liste iteriere, möchte ich Listenwörterbücher erstellen, wobei der Wert jedes Wörterbuchs auch eine Liste ist.Wie erstelle ich eine Liste von Wörterbüchern (mit Listenwerten) aus einer Liste?

würde die Struktur sein:

[{key1: [val1, val2]}, {key2: [val3, val4]}, {key3: [val5, val6]}, ...] 

ich mit einer Liste von ganzen Zahlen beginnen:

my_list = [3423, 77813, 12, 153, 1899] 

Für jedes Element in der Liste, soll dies ein Wörterbuch Schlüssel werden. Ich füge dann zwei Elemente an den Wert des Wörterbuchs an (was eine Liste ist). (Lassen Sie uns sagen, dass die beiden Elemente sind immer „Hund“ und „Katze“)

Hier ist, was das Endergebnis aussehen soll:

[{3423:['dog', 'cat']}, {77813:['dog', 'cat']}, {12:['dog', 'cat']}, 
    {153:['dog', 'cat']}, {1899:['dog', 'cat']}] 

Mein Versuch, dies zu tun, hat viele Probleme:

for i in my_list: 
    d = {} ## create a dictionary 'd' 
    d[i] = [].append('dog') ## or `d[i] = ['dog'].append('cat')` 
    my_list.append(d) ## here is a bug 
    my_list.remove(i) ## remove the item from the list 
  1. Ich mag es nicht, dass ich ein leeres Wörterbuch benennen muss, und haben sie jeweils das gleiche benannt (hier, d). Später würde ich gerne auf jedes dieser Wörterbücher mit den Schlüsseln zugreifen. Ihre Namen interessieren mich nicht.

  2. Ich weiß nicht, wie sinnvoll mehrere Elemente an den Wörterbuchwert angehängt werden, wenn es eigentlich eine Liste sein soll. Was, wenn ich mehrere Artikel hinzufügen möchte?

  3. Der Fehler hängt das Wörterbuch an die ursprüngliche Liste an und löscht dann das Element. Natürlich kann dies mit einer neuen Liste gelöst werden:

    new_list = [] 
    for i in my_list: 
        d = {} 
        d[i] = [].append('dog') 
        new_list.append(d) 
        my_list.remove(i) 
    

aber das fühlt sich sehr ungeschickt.

+1

Müssen Sie diese Struktur verwenden, um Ihr Ziel zu erreichen? Ein objektorientierter Ansatz könnte je nach dem, was Sie erreichen möchten, einen Teil der Komplexität verringern. Zumindest könntest du '' defaultdict'' im '' collections''-Modul betrachten. Dann könnten Sie '' list_dict = defaultdict (list) '' machen, damit Sie wissen, dass jeder Eintrag im dict bereits eine leere Liste ist. –

Antwort

6

Wenn Sie etwas wirklich einfach wollen, können Sie eine Liste Verständnis verwenden:

data = ['dog', 'cat'] 

my_list = [3423, 77813, 12, 153, 1899] 

result = [{k:data} for k in my_list] 

print(result) 
# [{3423: ['dog', 'cat']}, {77813: ['dog', 'cat']}, {12: ['dog', 'cat']}, {153: ['dog', 'cat']}, {1899: ['dog', 'cat']}] 

Zusätzlich ist hier ein Beispiel für das Hinzufügen/Werte mit dem sehr convienient defaultdict Entfernung:

from collections import defaultdict 

my_list = [3423, 77813, 12, 153, 1899] 

new_list = [] 
for number in my_list: 

    # create the defaultdict here 
    d = defaultdict(list) 

    # add some data 
    d[number] += ['dog', 'cat', 'kitten'] 

    # remove some data 
    d[number].remove('kitten') 

    # append dictionary 
    new_list.append(dict(d)) 

print(new_list) 

Welche Ausgänge:

[{3423: ['dog', 'cat']}, {77813: ['dog', 'cat']}, {12: ['dog', 'cat']}, {153: ['dog', 'cat']}, {1899: ['dog', 'cat']}] 

Verwenden Sie eine defaultdict hier ist hilfreich, da es jeden Eintrag im Wörterbuch mit einer leeren Liste initialisiert. Wenn Sie dies nicht tun möchten, können Sie dies mit einem normalen Wörterbuch erreichen, wie in Ihrer Frage gezeigt, aber das erfordert, dass Sie die leeren Listen selbst initialisieren.

+0

Warum wäre es "d [Nummer] + = ['Hund', 'Katze', 'Kätzchen']' anstelle von 'd [Zahl] = ['Hund', 'Katze', 'Kätzchen']'? – EB2127

2

Sie könnten eine collections.defaultdict Wörterbuch Unterklasse verwenden die Verarbeitung sehr einfach zu machen:

from collections import defaultdict 
from pprint import pprint 

my_list = [3423, 77813, 12, 153, 1899] 
d = defaultdict(list) 

for i in my_list: 
    d[i].append('dog') 
    d[i].append('cat') 

d = dict(d) # Convert d into a regular dictionary (optional). 
pprint(d) 

Ausgang:

{12: ['dog', 'cat'], 
153: ['dog', 'cat'], 
1899: ['dog', 'cat'], 
3423: ['dog', 'cat'], 
77813: ['dog', 'cat']} 

Natürlich, wenn alles, was Sie jetzt zu tun ist, diese beiden Elemente zu jedem anhang Eintrag wäre es etwas effizienter, beides in einem einzigen Vorgang wie dem folgenden zu tun:

for i in my_list: 
    d[i].extend(['dog', 'cat']) 
2

Wenn Sie das Listenverständnis mit verschiedenen Werten für jede Taste verwenden möchten.

keys = ['key1', 'key2', 'key3'] 
values = [['val11', 'val12'], ['val21', 'val22'], ['val31', 'val32']] 

# This is what you want (if I understood correctly) 
dlist = [{x:values[i]} for i,x in enumerate(keys)] 

print(dlist) 

# When you want to add more dictionary to the list 
dlist.append({'key4': ['val41', 'val42']}) 

print(dlist) 

Ausgang:

[{'key1':['val11','val12']}, {'key2':['val21','val22']}, {'key3':['val31','val32']}] 
[{'key1':['val11','val12']}, {'key2':['val21','val22']}, {'key3':['val31','val32']}, {'key4':['val41', 'val42']}] 
2

Sie brauchen nicht zu entfernen, ohne externen Modul zu importieren oder ohne es zu komplex zu machen, können Sie einfach dieses Muster in reinem Python folgen:

data = ['dog', 'cat'] 

my_list = [3423, 77813, 12, 153, 1899] 

new_data={} 
for item in my_list: 
    for sub_item in data: 

     if item not in new_data: 
      new_data[item]=[sub_item] 
     else: 
      new_data[item].append(sub_item) 

print(new_data) 

Ausgabe:

{153: ['dog', 'cat'], 1899: ['dog', 'cat'], 12: ['dog', 'cat'], 77813: ['dog', 'cat'], 3423: ['dog', 'cat']} 
Verwandte Themen