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?
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.
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)
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)