我有以下字典(短版,实际数据要大得多):
dict = {'C-STD-B&M-SUM:-1': 0, 'C-STD-B&M-SUM:-10': 4.520475, 'H-NSW-BAC-ART:-9': 0.33784000000000003, 'H-NSW-BAC-ART:0': 0, 'H-NSW-BAC-ENG:-59': 0.020309999999999998, 'H-NSW-BAC-ENG:-6': 0,}
我想将它分成较小的嵌套字典,具体取决于键名的一部分。
预期输出为:
# fixed closing brackets
dict1 = {'C-STD-B&M-SUM: {'-1': 0, '-10': 4.520475}}
dict2 = {'H-NSW-BAC-ART: {'-9': 0.33784000000000003, '0': 0}}
dict3 = {'H-NSW-BAC-ENG: {'-59': 0.020309999999999998, '-6': 0}}
背后的逻辑是:
dict1: if the part of the key name is 'C-STD-B&M-SUM', add to dict1.
dict2: if the part of the key name is 'H-NSW-BAC-ART', add to dict2.
dict3: if the part of the key name is 'H-NSW-BAC-ENG', add to dict3.
到目前为止的部分代码:
def divide_dictionaries(dict):
c_std_bem_sum = {}
for k, v in dict.items():
if k[0:13] == 'C-STD-B&M-SUM':
c_std_bem_sum = k[14:17], v
我要做的是创建我需要的嵌套字典,然后我将创建字典并添加嵌套字典,但我不确定它是否是一个很好的方法。
当我运行上面的代码时,变量c_std_bem_sum变为一个元组,只有两个值在每次迭代时都会改变。如何才能使它成为字典,以后我可以创建另一个字典,并使用这个字典作为其中一个键的值?
答案 0 :(得分:1)
接近它的一种方法是做类似
的事情d = {'C-STD-B&M-SUM:-1': 0, 'C-STD-B&M-SUM:-10': 4.520475, 'H-NSW-BAC-ART:-9': 0.33784000000000003, 'H-NSW-BAC-ART:0': 0, 'H-NSW-BAC-ENG:-59': 0.020309999999999998, 'H-NSW-BAC-ENG:-6': 0,}
def divide_dictionaries(somedict):
out = {}
for k,v in somedict.items():
head, tail = k.split(":")
subdict = out.setdefault(head, {})
subdict[tail] = v
return out
给出了
>>> dnew = divide_dictionaries(d)
>>> import pprint
>>> pprint.pprint(dnew)
{'C-STD-B&M-SUM': {'-1': 0, '-10': 4.520475},
'H-NSW-BAC-ART': {'-9': 0.33784000000000003, '0': 0},
'H-NSW-BAC-ENG': {'-59': 0.020309999999999998, '-6': 0}}
一些注意事项:
(1)我们使用嵌套字典而不是创建单独的命名字典,这是不方便的。
(2)我们使用setdefault,这是一种方便的方式来说“给我字典中的值,但如果没有,请将其添加到字典并返回它。”。保存if
。
(3)我们可以使用.split(":")
而不是硬编码宽度,这不是很强大 - 至少假设它是分隔符,无论如何!
(4)使用dict
(内置类型的名称)作为变量名称是个坏主意。
答案 1 :(得分:0)
那是因为你正在设置字典并用元组覆盖它:
>>> a = 1, 2
>>> print a
>>> (1,2)
现在举个例子:
>>> def divide_dictionaries(dict):
>>> c_std_bem_sum = {}
>>> for k, v in dict.items():
>>> if k[0:13] == 'C-STD-B&M-SUM':
>>> new_key = k[14:17] # sure you don't want [14:], open ended?
>>> c_std_bem_sum[new_key] = v
基本上,这会抓取其余的密钥(或3个字符,正如你所拥有的那样,[14:None]或[14:]将获得字符串的其余部分),然后将其用作新密钥字典。