附加到 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

但是为什么?

373486 次浏览

list.append返回 None时,dates_dict[key] = dates_dict.get(key, []).append(date)dates_dict[key]设置为 None

In [5]: l = [1,2,3]


In [6]: var = l.append(3)


In [7]: print var
None

你应该使用 收藏,默认信息

import collections
dates_dict = collections.defaultdict(list)

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将创建一个新列表,这将产生意想不到的副作用。例如,如果您只是想检索键的值,而该键不在那里,那么它将创建一个新列表并返回它。

还有更优雅的方式来编写这段代码吗?

使用 收藏,默认信息:

from collections import defaultdict


dates_dict = defaultdict(list)
for key, date in cur:
dates_dict[key].append(date)