【问题标题】:Dividing dictionary into nested dictionaries, based on the key's name on Python 3.4根据 Python 3.4 上的键名将字典划分为嵌套字典
【发布时间】:2015-06-10 01:33:43
【问题描述】:

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

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 变成了一个元组,每次迭代只有两个值发生变化。我怎样才能使它成为一个字典,以便我以后可以创建另一个字典,并将这个字典用作其中一个键的值?

【问题讨论】:

    标签: python python-3.x dictionary


    【解决方案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 作为变量名是个坏主意。

    【讨论】:

    • 在第一个注释中,您是说我应该有,例如,三个不同的字典,每个字典里面都有一个嵌套字典,或者我应该完全避免嵌套字典?谢谢最后一点,我一直用它,真的不好用,我不知道为什么我总是这样做嘿嘿。
    • 我的意思是,你应该有一个字典,而不是一个名为 dict1 的变量和一个名为 dict2 的变量和一个名为 dict3 的变量,你应该有一个字典,并使用你想要调用的变量作为键,如上所述。
    • 谢谢。是否可以将嵌套字典中的键转换为整数?
    【解决方案2】:

    那是因为你正在设置你的字典并用一个元组覆盖它:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 2019-06-26
      • 2014-03-30
      • 1970-01-01
      • 2020-10-20
      • 2021-05-10
      • 2023-02-10
      相关资源
      最近更新 更多