3

给定一个具有以下格式的字典:

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)

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

更新/澄清:

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

4

2 回答 2

7

除非这是家庭作业,否则为什么不能在defaultdict这里使用 a?

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

于 2013-05-13T03:53:20.070 回答
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
于 2013-05-13T03:51:38.593 回答