附加到Python字典中的列表

Mic*_*phy 64 python dictionary list python-3.x

是否有更优雅的方式来编写此代码?

我在做什么:我有钥匙和约会.可以为键分配许多日期,因此我创建了一个日期列表字典来表示这一点.以下代码工作正常,但我希望更优雅和Pythonic方法.

dates_dict = dict() 
for key,  date in cur:
    if key in dates_dict:
        dates_dict[key].append(date)
    else:
        dates_dict[key] = [date] 
Run Code Online (Sandbox Code Playgroud)

我期待以下工作,但我一直得到一个NoneType没有属性追加错误.

dates_dict = dict() 
for key,  date in cur:
    dates_dict[key] = dates_dict.get(key, []).append(date) 
Run Code Online (Sandbox Code Playgroud)

这可能与事实有关

print([].append(1)) 
None 
Run Code Online (Sandbox Code Playgroud)

但为什么?

the*_*eye 113

list.append返回None,因为它是一个就地操作,你将它分配给dates_dict[key].所以,下次当你这样做时,dates_dict.get(key, []).append你实际上正在做None.append.这就是失败的原因.相反,你可以做到

dates_dict.setdefault(key, []).append(date)
Run Code Online (Sandbox Code Playgroud)

但是,我们collections.defaultdict只为此目的.你可以做这样的事情

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

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

注意:defaultdict如果在字典中找不到密钥,将创建一个新列表,这将产生无意义的副作用.例如,如果您只想检索密钥的值(不存在),它将创建一个新列表并将其返回.

  • 使用defaultdict优于setdefault的优点是什么? (3认同)
  • @chepner:请注意,除了__getitem __()之外,任何其他操作都不会调用__missing __()。这意味着`get()`像普通字典一样,将默认情况下不返回`None`而不是使用`default_factory`,即,date_dict中的key和dates_dict.get(key)可以按预期工作 (2认同)

jfs*_*jfs 22

是否有更优雅的方式来编写此代码?

使用collections.defaultdict:

from collections import defaultdict

dates_dict = defaultdict(list)
for key, date in cur:
    dates_dict[key].append(date)
Run Code Online (Sandbox Code Playgroud)


Pad*_*ham 5

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
Run Code Online (Sandbox Code Playgroud)

您应该使用collections.defaultdict

import collections
dates_dict = collections.defaultdict(list)
Run Code Online (Sandbox Code Playgroud)