web-dev-qa-db-ja.com

Python:辞書のデフォルト値としてのlist()

私はPythonのようなコードを持っています:

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

しかし、私はこの 'if'ステートメントを回避するいくつかの方法があるはずだと思います。私は試した

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

そして

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

しかし、どちらも「TypeError:unhashable type: 'list'」について文句を言っています。何かお勧めですか?ありがとう!

24
Fysx

最良の方法は、listデフォルトで _collections.defaultdict_ を使用することです。

_from collections import defaultdict
dct = defaultdict(list)
_

次に、単に使用してください:

_dct[key].append(some_value)
_

キーがまだマッピングにない場合、辞書は新しいリストを作成します。 _collections.defaultdict_はdictのサブクラスであり、それ以外は通常のdictオブジェクトと同じように動作します。

標準のdictを使用する場合、dict.setdefault()は_dct[key]_をデフォルトに正しく設定するため、バージョンは正常に機能するはずです。その呼び出しは.append()でチェーンできます:

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

ただし、dct[key] = dct.get(...).append()を使用すると、_dct[key]_の値を.append()の出力(None

60
Martijn Pieters