Anhängen mehrerer Werte für eine Taste im Python-Wörterbuch

Ich bin neu in Python und ich habe eine Liste von Jahren und Werten für jedes Jahr. Was ich tun möchte, ist zu prüfen, ob das Jahr bereits in einem Wörterbuch existiert und wenn es tut, den Wert an diese Liste von Werten für den jeweiligen Schlüssel anhängen.

So zum Beispiel habe ich eine Liste von Jahren und habe einen Wert für jedes Jahr:

2010 2 2009 4 1989 8 2009 7 

Was ich tun möchte, ist ein Wörterbuch mit den Jahren als Schlüssel und die einstelligen Zahlen als Werte zu füllen. Allerdings, wenn ich 2009 zweimal aufgeführt habe, möchte ich diesen zweiten Wert an meine Liste von Werten in diesem Wörterbuch anhängen, also möchte ich:

 2010: 2 2009: 4, 7 1989: 8 

Im Moment habe ich folgendes:

 d = dict() years = [] (get 2 column list of years and values) for line in list: year = line[0] value = line[1] for line in list: if year in d.keys(): d[value].append(value) else: d[value] = value d[year] = year 

  • Kann ich ein Listenverständnis auf einer Liste von Wörterbüchern verwenden, wenn ein Schlüssel fehlt?
  • Python verschachtelte Wörterbuchsuche mit Standardwerten
  • Python-Argumente als Wörterbuch
  • TypeError: 'type' Objekt ist nicht indizierbar bei der Indizierung in ein Wörterbuch
  • In Python, wie kann ich über ein Wörterbuch in sortierter Reihenfolge iterieren?
  • Csv-Datei in python öffnen, um Wörterbuch
  • Verfügbare Menge aus dem Wörterbuch finden
  • Python: Schreiben Sie verschachtelte JSON als mehrere Elemente in List
  • 6 Solutions collect form web for “Anhängen mehrerer Werte für eine Taste im Python-Wörterbuch”

    Wenn ich deine Frage umformulieren kann, was du willst, ist ein Wörterbuch mit den Jahren als Schlüssel und ein Array für jedes Jahr mit einer Liste von Werten, die mit diesem Jahr verbunden sind, richtig? Hier ist, wie ich es tun würde:

     years_dict = dict() for line in list: if line[0] in years_dict: # append the new number to the existing array at this slot years_dict[line[0]].append(line[1]) else: # create a new array in this slot years_dict[line[0]] = [line[1]] 

    Was du in letzter Zeit am Ende hast, ist ein Wörterbuch, das wie folgt aussieht:

     { "2010": [2], "2009": [4,7], "1989": [8] } 

    Im Allgemeinen ist es eine schlechte Programmierpraxis, "parallele Arrays" zu erstellen, wo Gegenstände implizit miteinander verknüpft sind, indem sie denselben Index haben, anstatt die richtigen Kinder eines Containers zu sein, der sie beide umfasst.

    Sie würden am besten mit collections.defaultdict (hinzugefügt in Python 2.5). Hiermit können Sie den Standardobjekttyp eines fehlenden Schlüssels (z. B. eine list ) angeben.

    Also anstatt einen Schlüssel zu erstellen, wenn es nicht zuerst existiert und dann an den Wert des Schlüssels anhängt, schneidest du den Mittelmann aus und klick einfach direkt an nicht vorhandene Schlüssel an, um das gewünschte Ergebnis zu erhalten.

    Ein schnelles Beispiel mit Ihren Daten:

     >>> from collections import defaultdict >>> data = [(2010, 2), (2009, 4), (1989, 8), (2009, 7)] >>> d = defaultdict(list) >>> d defaultdict(<type 'list'>, {}) >>> for year, month in data: ... d[year].append(month) ... >>> d defaultdict(<type 'list'>, {2009: [4, 7], 2010: [2], 1989: [8]}) 

    Auf diese Weise müssen Sie sich keine Sorgen darüber machen, ob Sie eine Ziffer mit einem Jahr verbunden haben oder nicht. Sie nur anhängen und vergessen, wissen, dass ein fehlender Schlüssel wird immer eine Liste sein. Wenn ein Schlüssel bereits existiert, dann wird es nur angehängt werden.

    Sie können setdefault .

     for line in list: d.setdefault(year, []).append(value) 

    Dies funktioniert, weil setdefault die Liste zurückgibt sowie sie auf das Wörterbuch setzt, und weil eine Liste veränderlich ist, ist die Anhänge an die von setdefault zurückgegebene Version dieselbe wie die Anhänge an die Version im Wörterbuch selbst. Wenn das sinnvoll ist.

     d = {} # import list of year,value pairs for year,value in mylist: try: d[year].append(value) except KeyError: d[year] = [value] 

    Der Python-Weg – es ist einfacher, Vergebung zu bekommen, als um Erlaubnis zu bitten!

    Es ist einfacher, wenn man diese Werte in eine Liste von Tupeln bringt. Dazu können Sie das Listen-Slicing und die Zip-Funktion verwenden.

     data_in = [2010,2,2009,4,1989,8,2009,7] data_pairs = zip(data_in[::2],data_in[1::2]) 

    Zip nimmt eine beliebige Anzahl von Listen, in diesem Fall die geraden und ungeraden Einträge von data_in , und setzt sie zusammen in ein Tupel.

    Jetzt können wir die setdefault Methode verwenden.

     data_dict = {} for x in data_pairs: data_dict.setdefault(x[0],[]).append(x[1]) 

    setdefault nimmt einen Schlüssel und einen Standardwert und gibt entweder den zugehörigen Wert zurück oder gibt es keinen aktuellen Wert, den Standardwert. In diesem Fall erhalten wir entweder eine leere oder belegte Liste, die wir dann den aktuellen Wert anhängen.

    Hier ist eine alternative Möglichkeit, dies mit dem not in Betreiber zu tun:

     # define an empty dict years_dict = dict() for line in list: # here define what key is, for example, key = line[0] # check if key is already present in dict if key not in years_dict: years_dict[key] = [] # append some value years_dict[key].append(some.value) 
    Python ist die beste Programmiersprache der Welt.