web-dev-qa-db-fra.com

Ajout à la liste dans le dictionnaire Python

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?

57
Michael Murphy

_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.

103
thefourtheye

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)
20
jfs

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)
5
Padraic Cunningham