2013-11-15 59 views
0
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) 

我幾乎有答案,輸出= { 'Y':{ '一個':2}, 'X':{ 'B':3}, 'Z': {'b':4}}。 因此,x鍵將覆蓋'a':1.如何保留a和b?

+0

它不清楚你想要什麼。我看到你正在提供一個輸入 - >輸出對,但它仍然不能破譯你想要的。尤其是因爲從我坐的地方來看,這幾乎是隨意的排列。 – adityajones

+0

輸出只是爲了顯示我的輸出應該是什麼 – user2943615

+1

如果這樣簡單,用'return {'y':{'a':2},'x'替換你的代碼體:{'a' :1,'b':3},'z':{'b':4}}' – Steve314

回答

0

你需要這個什麼是檢查重點是已在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) 
+0

啊,完美!這正是我所期待的。 – user2943615

0

重複字典的缺點是,一旦更改了與給定鍵對應的值,就無法在字典中保留原始值。

例如,無論數據結構有多複雜,下面的覆蓋總是會發生。

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} 

你可以採取這樣的事實的值可以是任何類型的結構,包括陣列或字典的優勢,以存儲的值每個相繼的變化。

+1

你試過了你的第二塊的代碼? 'x,oldx = x,x'只是創建了兩個對原始'x'的引用。 'x is oldx'在該行後面返回'True'。也許你應該採取更傳統的方法:'oldx = x.copy()' – mgilson

+0

@mgilson哎呦,我的壞。固定。 – 2013-11-15 05:08:23

0

我已經得到了這個小腳本喲得到你的工作完成。
備註:只要輸入正確。

代碼:

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}} 

希望這有助於:)

0

我有這樣一個

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} 
相關問題