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

4

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

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

and I would want it be in required format:

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'], ['?']]}

非常感谢能够得到您的帮助。谢谢。


1
使用 defaultdict 而不是 setdefault - Dani Mesejo
4个回答

6

使用extend而不是append

new_d.setdefault(key, []).extend(value)
extend() 方法将一个可迭代对象(列表、元组、字符串等)中的所有元素添加到列表末尾。

2
如果你想使用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

1
你可以使用.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)

0

@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?'}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接