嵌套字典。合并公共键并将值附加到列表中。 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 值未附加。里面的代码的主要内容,如果未能解决你的问题,请参考以下文章