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

时间:2013-05-13 03:48:50

标签: python design-patterns dictionary

给出具有以下格式的字典:

dict_list = {key0: [list0,list1], key1: [list0,list1], ...}

我目前正在通过以下方式更新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)

有没有办法使用本机构造缩短此代码(即没有其他方法)?我越来越多地在我的代码中遇到这种“设置或更新”模式的数据,并想知道是否有更简洁的方法来执行此操作。

UPDATE /澄清:

dict_list的实际内容示例:

dict_list = {'John Solver': [['05/10/2013','05/14/2013','05/22/2013'],[20.33,40.12,10.13]]}

花车可以用美元代表John Solver的日常开支。

如果可能,我们希望继续使用两个长列表而不是许多日期 - 费用对,因为我们希望使用sum方便地执行一笔费用操作(dict_list ['John Solver'] [1] )。

2 个答案:

答案 0 :(得分:7)

除非这是家庭作业,为什么你不能在这里使用defaultdict

from collections import defaultdict
dict_list = defaultdict(list)

for key in list_of_possibly_new_keys:
    dict_list[key] += [list0, list1]

针对您的示例进行了更新:

>>> 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

除此之外:由于浮标的精度有限,使用它们代表货币通常是一个糟糕的主意。请考虑使用decimal模块

答案 1 :(得分:6)

您可以使用dict.setdefault

for key in list_of_possibly_new_keys:
      dict_list.setdefault(key,[]).extend([list0, list1])
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