2012-07-13 78 views
3

我想創建一個「轉換器」類型的dict,它將賦值爲嵌套的不同字符中的鍵,並將其轉換爲我創建的字典中的鍵。我遇到的問題是,我無法創建一個代表嵌套字典密鑰的值,而無需將其轉換爲字符串或其他數據類型,並且當我嘗試將字符串用作嵌套字典的索引時,我收到一個索引錯誤。理想情況下,我的字典會是這個樣子:在python中使用dict鍵作爲不同字典中的值

new_dict{ 
    "new_key_1" : ['subdict1']['subdict2']['old_key_1'], 
    "new_key_2" : ['subdict1']['subdict2']['old_key_2'], 
    "new_key_3" : ['subdict1']['subdict3']['old_key_3'] 
    } 

然後,對於每個嵌套的字典,我可以生成一個簡單的一個新的dict對象循環:

for key, value in new_dict.items() : 
    user_dict_1[key] = OldDict[value] 

嵌套類型的字典是非常大的我只需要從每個字段中選擇幾個字段,否則我可以使用.copy()函數來處理舊的字典。

PS-任何幫助改寫這個問題更可讀性也值得讚賞。

+0

當你說'[ 'subdict1'] [ 'subdict2'] [ 'old_key_1']'你的意思是像一個嵌套字典 - >'{'subdict1':{'subdict2':'old_key_1'}}'或者一系列的字典?我沒有那麼好。如果你可以發佈爲什麼你想要這樣做,我們可以以不同的方式幫助你(也許更簡單的方法)來處理你的問題 – Hassek 2012-07-13 16:53:44

+0

是的,它是一個嵌套的字典,但old_key_1是一個鍵 - 就像{'subdict1':{subdict2:{ old_key_1:some_value,old_key_2:some_other value}}}。它實際上是一個在Python中轉換爲字典的JSON-rpc對象。 – paulski 2012-07-13 19:51:43

回答

4

你會需要reduce()這一個...

attrmap = { 
    "new_key_1": ('subdict1', 'subdict2', 'old_key_1'), 
    ... 
} 

print reduce(lambda x, y: x[y], attrmap[somekey], old_object) 
+0

不錯的答案。我贊成它。 – DevPlayer 2012-07-13 17:09:59

+0

Ignacio,你能詳細解釋一下這個答案嗎?我試圖讓這個代碼工作,但我不斷收到一個AttributeError:dict對象沒有屬性'subdict1'。 – paulski 2012-07-13 20:20:03

+0

Pfft。那是因爲我搞砸了。 – 2012-07-13 20:23:34

0

你說這樣的事情?

from pprint import pprint as pp 
subdict1 = {'subdict1_item1':1, 'subdict1_item2':2} 
subdict2 = {'subdict2_item1':3, 'subdict2_item2':4} 
subdict3 = {'subdict3_item1': 5, 'subdict3_item1':6} 
olddict = { 
    'old_key_1': [subdict1, subdict2], 
    'old_key_2': [subdict1, subdict2], 
    'old_key_3': [subdict1, subdict3], 
    } 

newdict = { 
    'new_key_1': olddict['old_key_1'].append('old_key_1'), 
    'new_key_2': olddict['old_key_2'].append('old_key_2'), 
    'new_key_3': olddict['old_key_3'].append('old_key_3'), 
    } 

或本

newdict = { 
    'new_key_1': 'old_key_1', 
    'new_key_2': 'old_key_2', 
    'new_key_3': 'old_key_3', 
    } 
def getnew(newkey, newdict, olddict): 
    if newkey in newdict: 
     oldkey = newdict[newkey] 
     if oldkey in olddict: 
      preitem = olddict[ oldkey ] # returns a list with two items 
      item = [] 
      item.append([preitem[0]]) # makes subdict1 wrapped in a list 
      item.append([preitem[1]]) # makes subdict2/3 wrapped in a list 
      item.append([oldkey]) 
      return item 
     else: 
      raise KeyError('newdict has no matching olddict key') 

結果:

pp(getnew('new_key_1', newdict, olddict)) 
print 
pp(getnew('new_key_2', newdict, olddict)) 
print 
pp(getnew('new_key_3', newdict, olddict)) 
[[{'subdict1_item1': 1, 'subdict1_item2': 2}], 
[{'subdict2_item1': 3, 'subdict2_item2': 4}], 
['old_key_1']] 

[[{'subdict1_item1': 1, 'subdict1_item2': 2}], 
[{'subdict2_item1': 3, 'subdict2_item2': 4}], 
['old_key_2']] 

[[{'subdict1_item1': 1, 'subdict1_item2': 2}], 
[{'subdict3_item1': 6}], 
['old_key_3']] 
相關問題