如何将字典的字典转换为指定格式的字典?

How to convert dict of dict to dict of specified format?

我有一个字典的字典如下所示:

d = {0: {1: ["hello"], 2: ["How are you"]}, 1: {1: ["!"], 2: ["?"]}}

我希望它采用所需格式:

result = {1:["hello", "!"], 2: ["How are you", "?"]} 

但是,我使用下面的代码以下列格式得到它:

new_d = {}
for sub in d.values():
    for key, value in sub.items():
        new_d.setdefault(key, []).append(value)

结果不符合要求的结构,它会生成一个列表列表。

{1: [['hello'], ['!']], 2: [['How are you'], ['?']]}

如有任何帮助,我们将不胜感激。谢谢

使用extend代替append:

new_d.setdefault(key, []).extend(value)

extend() 方法将可迭代对象(列表、元组、字符串等)的所有元素添加到列表的末尾。

如果您想使用 append() 函数解决此问题,请尝试以下代码:

new_d = {}
for sub in d.values():
    for key, value in sub.items():

        # Control key exist...
        if(key in new_d.keys()):
            
            new_d[key].append(value[0])
        else:
            new_d[key] = value

您可以使用 .extend(value) 而不是 .append(value) 或者您可以添加一个基本的 for 循环来展平所有字典值的列表,如下所示。

new_d = {}
for sub in d.values():
    for key, value in sub.items():
        new_d.setdefault(key, []).extend(value)


for i in range (0,len(d)):
    new_d[i+1] = [item for sublist in new_d.get(i+1) for item in sublist]
print(new_d)

@Gabip 接受的答案正确地指出您唯一的错误是使用 append 而不是 extend

该错误已得到纠正,我还想建议一种使用字典理解的稍微不同的方法:

d = {0: {1: ["hello"], 2: ["How are you"]}, 1: {1: ["!"], 2: ["?"]}}

new_d = {key: d[0].get(key, []) + d[1].get(key, []) for key in d[0]}
# {1: ['hello', '!'], 2: ['How are you', '?']}

或者从 d[0] 和 d[1] 获取密钥的更健壮的版本,以防某些密钥在 d[1] 但不在 d[0] 中:

d = {0: {1: ["hello"], 2: ["How are you"]}, 1: {1: ["!"], 2: ["?"], 3: ['>>>']}}

new_d = {key: d[0].get(key, []) + d[1].get(key, []) for key in set(d[0].keys()) | set(d[1].keys())}
# {1: ['hello', '!'], 2: ['How are you', '?'], 3: ['>>>']}

最后,这不是您问题的明确部分,但我建议使用 str.join 来连接字符串:

d = {0: {1: ["hello"], 2: ["How are you"]}, 1: {1: ["!"], 2: ["?"]}}

new_d = {key: ''.join(d[0].get(key, []) + d[1].get(key, [])) for key in d[0]}
# {1: 'hello!', 2: 'How are you?'}