从两个列表创建嵌套字典,其中一个列表包含字典

Creating nested dictionary from two lists one of which contains dictionaries

非常相似,但有一个额外的警告。

我有两个长度相同的列表。一个包含我的键,另一个包含属于所述键的字典列表。下面的示例(是的,Nones 是故意的)

keys = ['key1', 'key2, 'key3']
vals = [[{'subkey1': 'val1', 'subkey2': 'val2'}], [{'subkey1: 'val2'},None],[{'subkey1':'val3'}, {'subkey3':'val1}, None, None]]

我想做的是将每个列表中的每个 字典 匹配到一个键以创建一个嵌套的字典。

所以像下面这样:

final = {'key1':{'subkey1': 'val1', 'subkey2': 'val2'}, 'key2':{'subkey1': 'val2'}, 'key3':{'subkey1':'val3'}, {'subkey3':'val1'}}

我知道我们可以使用字典理解来做到这一点。我创建了一个空字典字典。

s = {}
for i in keys:
    for v in vals:
        s[i] = {}
        break  

然后我编写了以下代码来遍历我想配对的字典列表,以解释我列表中的非字典值。

x = 0
while x < len(keys):
    for i in keys:
        for element in vals[x]:
            if isinstance(element, dict) == True:
                s[str(i)].append(element)
            else:
                print('no')
    x=x+1

但是当我 运行 这个时,我得到 AttributeError: 'NoneType' object has no attribute 'append'

如何使用这个 for 循环附加到字典?

不能在字典上使用追加 也许试试这个?

keys = ['key1', 'key2', 'key3']
vals = [[{'subkey1': 'val1', 'subkey2': 'val2'}], [{'subkey1': 'val2'},None],[{'subkey1':'val3'}, {'subkey3':'val1'}, None, None]]
s = {}
for i in keys:
    s[i] = {}
for i, key in enumerate(keys):
    for element in vals[i]:
        if isinstance(element, dict) == True:
            s[str(key)].update(element)
print(s)

输出:

{'key1': {'subkey1': 'val1', 'subkey2': 'val2'}, 'key2': {'subkey1': 'val2'}, 'key3': {'subkey1': 'val3', 'subkey3': 'val1'}}

这可以很容易地使用 defaultdict:

from collections import defaultdict

keys = ['key1', 'key2', 'key3']
vals = [
  [{'subkey1': 'val1', 'subkey2': 'val2'}],
  [{'subkey1': 'val2'},None],
  [{'subkey1':'val3'}, {'subkey3':'val1'}, None, None]
]

final = defaultdict(dict)

for idx, key in enumerate(keys):
    for d in vals[idx]:
        if d is not None:
            final[key].update(d)

输出:

defaultdict(<class 'dict'>, {
 'key1': {'subkey1': 'val1', 'subkey2': 'val2'},
 'key2': {'subkey1': 'val2'},
 'key3': {'subkey1': 'val3', 'subkey3': 'val1'}
})

对于可读性较差的词典理解解决方案

keys = ['key1', 'key2', 'key3']
vals = [
  [{'subkey1': 'val1', 'subkey2': 'val2'}],
  [{'subkey1': 'val2'}, None],
  [{'subkey1': 'val3'}, {'subkey3':'val1'}, None, None]
]

s = {
    k: {
        sk: sv for d in (x for x in v if x is not None) for sk, sv in d.items()
    } for k, v in zip(keys, vals)
}

给予

{'key1': {'subkey1': 'val1', 'subkey2': 'val2'},
 'key2': {'subkey1': 'val2'},
 'key3': {'subkey1': 'val3', 'subkey3': 'val1'}}