在Python中设置或更新字典条目代码模式

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])方便地执行费用总和操作.

Joh*_*ooy 7

除非这是作业,为什么你不能在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模块


Ash*_*ary 6

你可以使用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)