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如果在字典中找不到密钥,将创建一个新列表,这将产生无意义的副作用.例如,如果您只想检索密钥的值(不存在),它将创建一个新列表并将其返回.
jfs*_*jfs 22
是否有更优雅的方式来编写此代码?
from collections import defaultdict
dates_dict = defaultdict(list)
for key, date in cur:
dates_dict[key].append(date)
Run Code Online (Sandbox Code Playgroud)
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)
import collections
dates_dict = collections.defaultdict(list)
Run Code Online (Sandbox Code Playgroud)