追加到Python字典中的列表

2024-04-25 13:44:34 发布

您现在位置: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 

但为什么呢?


Tags: 方法key代码in列表fordateif
3条回答

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

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

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

In [7]: print var
None

你应该使用collections.defaultdict

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)

但是,我们只有这个目的。你可以这样做

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

如果在字典中找不到key,这将创建一个新的列表对象。

注意:由于defaultdict将创建一个新列表如果在字典中找不到该键,这将产生意想不到的副作用。例如,如果您只想检索不存在的键的值,它将创建一个新列表并返回该值。

Is there a more elegant way to write this code?

使用collections.defaultdict

from collections import defaultdict

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

相关问题 更多 >