web-dev-qa-db-fra.com

Python: list () comme valeur par défaut pour le dictionnaire

J'ai Python code qui ressemble à:

if key in dict:
  dict[key].append(some_value)
else:
  dict[key] = [some_value]

mais je pense qu'il devrait y avoir une méthode pour contourner cette déclaration "si". j'ai essayé

dict.setdefault(key, [])
dict[key].append(some_value)

et

dict[key] = dict.get(key, []).append(some_value)

mais les deux se plaignent de "TypeError: type non partageable: 'liste'". Des recommandations? Merci!

24
Fysx

La meilleure méthode consiste à utiliser collections.defaultdict avec un list par défaut:

from collections import defaultdict
dct = defaultdict(list)

Ensuite, utilisez simplement:

dct[key].append(some_value)

et le dictionnaire créera une nouvelle liste pour vous si la clé n'est pas encore dans le mappage. collections.defaultdict Est une sous-classe de dict et se comporte autrement comme un objet dict normal.

Lorsque vous utilisez un dict, dict.setdefault() définit correctement dct[key] Pour vous par défaut, de sorte que la version aurait dû fonctionner correctement. Vous pouvez enchaîner cet appel avec .append():

>>> dct = {}
>>> dct.setdefault('foo', []).append('bar')  # returns None!
>>> dct
{'foo': ['bar']}

Cependant, en utilisant dct[key] = dct.get(...).append() vous remplacez la valeur de dct[key] Par la sortie de .append(), qui est None.

60
Martijn Pieters