Existe-t-il un moyen plus élégant d'écrire ce code?
Ce que je fais: j'ai les clés et les dates. Il peut y avoir un certain nombre de dates attribuées à une clé et je crée donc un dictionnaire de listes de dates pour le représenter. Le code suivant fonctionne bien, mais j'espérais une méthode plus élégante et Pythonic.
dates_dict = dict()
for key, date in cur:
if key in dates_dict:
dates_dict[key].append(date)
else:
dates_dict[key] = [date]
Je m'attendais à ce que le programme ci-dessous fonctionne, mais je continue à recevoir un NoneType n'a pas d'attribut et ajoute une erreur.
dates_dict = dict()
for key, date in cur:
dates_dict[key] = dates_dict.get(key, []).append(date)
Cela a probablement quelque chose à voir avec le fait que
print([].append(1))
None
mais pourquoi?
_list.append
_ renvoie None
, puisqu'il s'agit d'une opération sur place et que vous la réassignez à _dates_dict[key]
_. Ainsi, la prochaine fois que vous ferez dates_dict.get(key, []).append
vous ferez réellement _None.append
_. C'est pourquoi il échoue. Au lieu de cela, vous pouvez simplement faire
_dates_dict.setdefault(key, []).append(date)
_
Mais nous avons collections.defaultdict
uniquement à cette fin. Vous pouvez faire quelque chose comme ça
_from collections import defaultdict
dates_dict = defaultdict(list)
for key, date in cur:
dates_dict[key].append(date)
_
Cela créera un nouvel objet de liste si la key
n'est pas trouvée dans le dictionnaire.
Remarque: Étant donné que la defaultdict
créera une nouvelle liste si la clé n'est pas trouvée dans le dictionnaire, cela aura des effets secondaires non intentionnels. Par exemple, si vous souhaitez simplement récupérer une valeur pour la clé, qui n’y figure pas, une nouvelle liste sera créée et renvoyée.
Existe-t-il un moyen plus élégant d'écrire ce code?
Utilisez 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)
définit dates_dict[key]
sur None
comme list.append
renvoie None
.
In [5]: l = [1,2,3]
In [6]: var = l.append(3)
In [7]: print var
None
Vous devriez utiliser collections.defaultdict
import collections
dates_dict = collections.defaultdict(list)