1. ホーム
  2. python

[解決済み] Python辞書のリストへの追加 [duplicate]

2022-07-24 10:21:20

質問

このコードにもっとエレガントな書き方はないのでしょうか?

私がやっていること 私はキーと日付を持っています。キーにはいくつもの日付が割り当てられるので、私はこれを表すために日付のリストの辞書を作成しています。以下のコードはうまく動作しますが、私はよりエレガントでPythonicな方法を望んでいました。

dates_dict = dict() 
for key,  date in cur:
    if key in dates_dict:
        dates_dict[key].append(date)
    else:
        dates_dict[key] = [date] 

下記がうまくいくと思っていたのですが、NoneType has no attribute appendというエラーが出続けています。

dates_dict = dict() 
for key,  date in cur:
    dates_dict[key] = dates_dict.get(key, []).append(date) 

ということが関係しているのでしょう。

print([].append(1)) 
None 

が、なぜ?

どのように解決するのですか?

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 はキーが辞書にない場合、新しいリストを作成するので、意図しない副作用が発生します。たとえば、単にそこにないキーの値を取得したい場合、新しいリストを作成してそれを返します。