1
input = { "a" : { "x": 1, "y": 2 },
     "b" : { "x": 3, "z": 4 } }
output = {'y': {'a': 2},
                'x': {'a': 1, 'b': 3},
                'z': {'b': 4} }

我需要根据输入制作一个新字典,它应该作为输出出现。到目前为止,我已经写过:

def pivot_nested_dict(nested_dict):
5       stateDict={}
6       for i in nested_dict:
7           dict2=nested_dict[i]
8           for j in dict2:
9               stateDict[j]= {i: dict2[j]}
10      return stateDict
11  
12  print pivot_nested_dict(input)

我几乎有了答案,output={'y': {'a': 2}, 'x': {'b': 3}, 'z': {'b': 4}}。所以,x 键覆盖了 'a': 1. 我如何同时保留 a 和 b?

4

4 回答 4

1

如果不复制字典,一旦更改与给定键对应的值,就无法在字典中保留原始值。

例如,无论数据结构多么复杂,下面的覆盖总是会发生。

x = {'a':1}
x['a'] = 2
print x
>>> {'a': 2}

您可以复制它,但需要手动管理原始值。

x = {'a':1}
x,oldx = x,x.copy()
oldx['a'] = 2
print x, oldx
>>> {'a': 2} {'a': 1}

您可以利用值可以是任何类型的结构(包括数组或字典)这一事实来存储值的每个连续变化。

于 2013-11-15T05:01:44.823 回答
1

您需要做的是检查键是否已经在 中stateDict,如果是,则将新元素添加到嵌套字典中:

def pivot_nested_dict(nested_dict):
    stateDict = {}
    for i in nested_dict:
        dict2 = nested_dict[i]
        for j in dict2:
            if j not in stateDict:
                stateDict[j] = {i: dict2[j]}
            else:
                stateDict[j][i] = dict2[j]
    return stateDict

print pivot_nested_dict(inp)
于 2013-11-15T05:06:53.677 回答
1

我有这个小脚本你完成你的工作。
注意:只要输入正确。

代码:

output = {}
for d in input.items():
    for item in d:
        if type(item) == dict:
            for i in item.keys():
                d = {k:item[i]}
                output[i] = {k:item[i]} if not i in output.keys() else dict(output[i].items() + d.items())
        else: k=item  

输入:

input = { "a" : { "x": 1, "y": 2 ,'z':15},"b" : { "x": 3, "z": 4 } }

输出:

{'y': {'a': 2}, 'x': {'a': 1, 'b': 3}, 'z': {'a': 15, 'b': 4}}  

希望这可以帮助 :)

于 2013-11-15T05:40:26.720 回答
1

我有这个

input = { "a" : { "x": 1, "y": 2 },
     "b" : { "x": 3, "z": 4 } }

output = {}

for k,v in zip(input.keys(), input.values()):
    for kk, vv in zip(v.keys(), v.values()):
        if kk in output.keys():
            output[kk][k] = vv
        else:
            output[kk] = {k : vv}
于 2013-11-15T08:06:58.980 回答