嵌套字典。合并公共键并将值附加到列表中。 0 值未附加。里面的代码

Posted

技术标签:

【中文标题】嵌套字典。合并公共键并将值附加到列表中。 0 值未附加。里面的代码【英文标题】:Nested dictionary. Merging common keys and appending values to list. 0 value isn't appending. Code inside 【发布时间】:2021-12-31 11:49:50 【问题描述】:

代码:https://pastebin.com/GJn74YX5

我有一个包含数据结构的嵌套字典:

foo[count] [字符串变量] = value

foo =  0 :  "a": 2,   "b": 5, "c": 6,
        1 :  "a": 3,   "b": 8, "d": 9,
        2 :  "b": 5,   "d": 9, "c": 3

我想获取这些 dicts 的共同值并将共同值组合到适当的键变量中。也许在新的字典中可行。如果公共变量不适用于该特定计数,它将添加一个 0。新字典中的所有值都应该是相同的长度。要看起来像这样:

 "a": [2, 3, 0], "b": [5, 8, 5], "c":[6, 0, 3], "d": [0,9,9] 

我的做法:

    创建 newdict 一个 defaultdict(list),这样我就可以检查 key 是否存在并附加到上面看到的列表中。这将是我想要的最终字典

     newdict = defaultdict(list)  
    

    创建以下 for 循环以附加到新字典:

    for count in foo.keys():
        for variable in foo[count].keys():
            if variable in foo[count].keys():
                newdict[variable].append(foo[count].get(variable))
            elif variable not in foo[count].keys():
                newdict[variable].append(0)     
            else:
                newdict[variable] = foo[count].get(variable)
    

我的问题:

输出:

 "a": [2, 3], "b": [5, 8, 5], "c":[6, 3], "d": [9,9] 
newdict 似乎合并了所有值,但它似乎总是朝着第一个 if 语句 永远不会到达 elif 块 -- 永远不会将 0 附加到列表中 else 块 也从未到达,但它似乎是正确附加的,所以可能没什么大不了的(?)

我花了几个小时似乎无法解释为什么没有附加 0。任何帮助表示赞赏。提前谢谢!

【问题讨论】:

【参考方案1】:

问题出在这几行代码中:

    for count in foo.keys():
    for variable in foo[count].keys():

您正在按照它们出现的顺序浏览这些键,例如,如果“d”只出现在与第二个键相关的字典中,那么它在第一个位置将没有任何值。该问题可以通过首先生成一个随后可能出现的所有键的列表来解决,以下代码可以工作,但是可以对其进行优化。

from collections import defaultdict
 
foo =  0 :  "a": 2,   "b": 5, "c": 6,
        1 :  "a": 3,   "b": 8, "d": 9,
        2 :  "b": 5,   "d": 9, "c": 3 
key_list = []
for count in foo.keys():
    for variable in foo[count].keys():
        if variable not in key_list:
            key_list.append(variable)
newdict = defaultdict(list)  
 
for count in foo.keys():
    for variable in key_list:
        if variable in foo[count].keys():
            newdict[variable].append(foo[count].get(variable))
        elif variable not in foo[count].keys():
            newdict[variable].append(0)
        else:
            newdict[variable] = foo[count].get(variable)
newdict

【讨论】:

【参考方案2】:

这是一种可能的替代方法:

from collections import defaultdict

# directly prepare the correct list size
newdict = defaultdict(lambda: [0]*len(foo))

for count in foo:
    for v in foo[count]:
        newdict[v][count] = foo[count][v]

输出:

>>> dict(newdict)
'a': [2, 3, 0],
 'b': [5, 8, 5],
 'c': [6, 0, 3],
 'd': [0, 9, 9]

如果字典索引不是 0,1,2...,您可以使用 for i count in enumerate(foo)i 将作为子列表的索引。

【讨论】:

【参考方案3】:

希望,这也可能有所帮助:

all_keys = []
newdict = 

# identify all unique keys
for count in foo.keys():
    all_keys.append(list(foo[count].keys()))
all_keys = np.unique(all_keys)

# prepare final dictionary
for i in all_keys:
    newdict[i] = []

# collect data
for count in foo.keys():
    check_key = set(list(all_keys)).difference(list(foo[count].keys()))
    for variable in foo[count].keys():
        newdict[variable].append(foo[count][variable])
    if check_key:
        for key in check_key:
            newdict[key].append(0)

newdict

【讨论】:

以上是关于嵌套字典。合并公共键并将值附加到列表中。 0 值未附加。里面的代码的主要内容,如果未能解决你的问题,请参考以下文章

带有字典、列表和 If 语句的嵌套循环

将嵌套的键/值和嵌套列表合并到 json

如何将嵌套字典列表与它们的值中的公共键相加? [复制]

为字典中的一个键附加多个值[重复]

将字典附加到循环中的列表

为啥嵌套字典不能正确附加到列表中?