このコードをもっとエレガントに書く方法はありますか?
私がやっていること: キーと日付があります。キーには複数の日付が割り当てられる可能性があるため、これを表す日付リストの辞書を作成しています。次のコードは問題なく動作しますが、よりエレガントで Python らしい方法を期待していました。
dates_dict = dict()
for key, date in cur:
if key in dates_dict:
dates_dict[key].append(date)
else:
dates_dict[key] = [date]
以下が機能することを期待していましたが、NoneType に属性追加がありませんというエラーが発生し続けます。
dates_dict = dict()
for key, date in cur:
dates_dict[key] = dates_dict.get(key, []).append(date)
これはおそらく、
print([].append(1))
None
しかし、なぜ?
ベストアンサー1
list.append
は を返しますNone
。これはインプレース操作であり、 に代入し直しているからですdates_dict[key]
。そのため、次に を実行するときは、dates_dict.get(key, []).append
実際には を実行していることになりNone.append
ます。これが失敗の理由です。代わりに、次のように実行できます。
dates_dict.setdefault(key, []).append(date)
しかし、私たちはcollections.defaultdict
この目的のためだけに。次のようなことができます
from collections import defaultdict
dates_dict = defaultdict(list)
for key, date in cur:
dates_dict[key].append(date)
key
辞書内に見つからない場合は、新しいリスト オブジェクトが作成されます。
注記:キーが辞書に見つからない場合は新しいリストが作成されるためdefaultdict
、意図しない副作用が発生します。たとえば、存在しないキーの値を取得したいだけの場合は、新しいリストが作成され、その値が返されます。