Python辞書のリストに追加する [重複] 質問する

Python辞書のリストに追加する [重複] 質問する

このコードをもっとエレガントに書く方法はありますか?

私がやっていること: キーと日付があります。キーには複数の日付が割り当てられる可能性があるため、これを表す日付リストの辞書を作成しています。次のコードは問題なく動作しますが、よりエレガントで 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、意図しない副作用が発生します。たとえば、存在しないキーの値を取得したいだけの場合は、新しいリストが作成され、その値が返されます。

おすすめ記事