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

我在做什么:我有 keys 和日期.一个键可以有许多日期,因此我正在创建一个日期列表字典来表示这一点.下面的代码工作得很好,但我希望有一个更优雅、更具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 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,这将创建一个新的列表对象.

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

Python-3.x相关问答推荐

网站抓取:当我使用Chrome DevTools中的网络选项卡时,找不到正确的URL来提供我想要的数据

按长度和字母数字对Pandas 数据帧列进行排序

正确的本地react 方式-Django身份验证

十进制浮点数到整型的转换错误

CSV-DAT 转换时将引号添加到数据中

try 使用 GEKKO 求解非线性方程组.系统有多种解决方案,但 GEKKO 给出了错误的解决方案.我该如何解决?

Python pandas将单元格值移动到同一行中的另一个单元格

如何在带有 GUI 的 python 游戏中设置回答时间限制?

spinbutton调整up/down箭头

python用户输入5个偶数并打印最大的

具有函数值的 Python 3 枚举

两个Pandas数据框中的共同列列表

如何从 Python 3.5 降级到 Python 3.4

为什么不切换到 Python 3.x?

Python3四舍五入到最接近的偶数

if 语句中冒号的语法错误

如何将 Matplotlib 图形转换为 PIL Image 对象(不保存图像)

将字符串拆分为最大长度 X 的片段 - 仅在空格处拆分

在 Ipython 中使用 Pylint (Jupyter-Notebook)

python中的绝对导入是什么?