sil*_*tar 3 python dictionary design-patterns
给定具有以下格式的字典:
dict_list = {key0: [list0,list1], key1: [list0,list1], ...}
Run Code Online (Sandbox Code Playgroud)
我目前正在dict_list
以下列方式更新:
for key in list_of_possibly_new_keys:
if key not in dict_list.keys():
dict_list[key] = [list0, list1]
else:
dict_list[key][0].extend(list0)
dict_list[key][1].extend(list1)
Run Code Online (Sandbox Code Playgroud)
有没有办法使用本机构造使代码更短(即没有其他方法)?我越来越多地在我的代码中遇到这种"设置或更新"模式的数据,并想知道是否有更简洁的方法来做到这一点.
UPDATE /澄清:
dict_list的实际内容示例:
dict_list = {'John Solver': [['05/10/2013','05/14/2013','05/22/2013'],[20.33,40.12,10.13]]}
Run Code Online (Sandbox Code Playgroud)
花车可以用美元代表John Solver的日常开支.
如果可能的话,我们希望继续使用两个长列表而不是许多日期 - 费用对,因为我们希望使用sum(dict_list ['John Solver'] [1])方便地执行费用总和操作.
除非这是作业,为什么你不能在defaultdict
这里使用?
from collections import defaultdict
dict_list = defaultdict(list)
for key in list_of_possibly_new_keys:
dict_list[key] += [list0, list1]
Run Code Online (Sandbox Code Playgroud)
更新了您的示例:
>>> from collections import defaultdict
>>> dict_list = defaultdict(lambda :[[], []])
>>> dict_list['John Solver'][0].append('05/10/2013')
>>> dict_list['John Solver'][1].append(20.33)
and so on
Run Code Online (Sandbox Code Playgroud)
旁白:原来,由于浮标的精度有限,使用它们代表货币通常是一个糟糕的主意.请考虑使用该decimal
模块
你可以使用dict.setdefault
:
for key in list_of_possibly_new_keys:
dict_list.setdefault(key,[]).extend([list0, list1])
Run Code Online (Sandbox Code Playgroud)
帮助在dict.setdefault
:
>>> dict.setdefault?
Type: method_descriptor
String Form:<method 'setdefault' of 'dict' objects>
Namespace: Python builtin
Docstring: D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D
Run Code Online (Sandbox Code Playgroud)