根据Python 3.4上的密钥名称将字典划分为嵌套字典

时间:2015-06-10 01:33:43

标签: python python-3.x dictionary

我有以下字典(短版,实际数据要大得多):

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变为一个元组,只有两个值在每次迭代时都会改变。如何才能使它成为字典,以后我可以创建另一个字典,并使用这个字典作为其中一个键的值?

2 个答案:

答案 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:]将获得字符串的其余部分),然后将其用作新密钥字典。