it-swarm.com.de

An Liste im Python Wörterbuch anhängen

Gibt es eine elegantere Art, diesen Code zu schreiben?

Was ich mache: Ich habe Schlüssel und Daten. Es kann eine Reihe von Daten geben, die einem Schlüssel zugewiesen sind. Daher erstelle ich ein Wörterbuch mit Datumslisten, um dies darzustellen. Der folgende Code funktioniert einwandfrei, aber ich hatte mir eine elegantere und pythonischere Methode erhofft.

dates_dict = dict() 
for key,  date in cur:
    if key in dates_dict:
        dates_dict[key].append(date)
    else:
        dates_dict[key] = [date] 

Ich hatte erwartet, dass das Folgende funktioniert, aber ich erhalte immer wieder einen NoneType, der keinen Attributanfügungsfehler aufweist.

dates_dict = dict() 
for key,  date in cur:
    dates_dict[key] = dates_dict.get(key, []).append(date) 

Das hat wahrscheinlich etwas damit zu tun, dass

print([].append(1)) 
None 

aber wieso?

57
Michael Murphy

list.append Gibt None zurück, da es sich um eine direkte Operation handelt, die Sie wieder dates_dict[key] Zuweisen. Wenn Sie also das nächste Mal dates_dict.get(key, []).append ausführen, führen Sie tatsächlich None.append Aus. Deshalb scheitert es. Stattdessen können Sie einfach tun

dates_dict.setdefault(key, []).append(date)

Aber wir haben collections.defaultdict nur für diesen Zweck. Sie können so etwas tun

from collections import defaultdict
dates_dict = defaultdict(list)
for key, date in cur:
    dates_dict[key].append(date)

Dadurch wird ein neues Listenobjekt erstellt, wenn das key nicht im Wörterbuch gefunden wird.

Hinweis: Da das defaultdict eine neue Liste erstellt, wenn der Schlüssel nicht im Wörterbuch gefunden wird, hat dies unbeabsichtigte Nebenwirkungen . Wenn Sie beispielsweise einfach einen Wert für den Schlüssel abrufen möchten, der nicht vorhanden ist, wird eine neue Liste erstellt und zurückgegeben.

103
thefourtheye

Gibt es eine elegantere Art, diesen Code zu schreiben?

Verwenden Sie collections.defaultdict :

from collections import defaultdict

dates_dict = defaultdict(list)
for key, date in cur:
    dates_dict[key].append(date)
20
jfs

dates_dict[key] = dates_dict.get(key, []).append(date) setzt dates_dict[key] bis None als list.append gibt None zurück.

In [5]: l = [1,2,3]

In [6]: var = l.append(3)

In [7]: print var
None

Sie sollten collections.defaultdict verwenden

import collections
dates_dict = collections.defaultdict(list)
5