2017-09-13 138 views
-2

我的字典是這樣的:蟒蛇字典改變嵌套鍵值

{ 
    '_id': 'uuid1', 
    'languages':{'_id':'uuid2'}, 
    'experiences':{'_id':'uuid3', 
        'values': [{'_id':'uuid4'}, 
           'responsibilities':{'_id':'uuid5', 
                'values':[{'_id':'uuid6'}]} 
          ] 
        } 
} 

,我想改變這一切_id與新的UUID。有沒有辦法在Python中實現這一點?

謝謝。

+0

新的uuid對每個id都是一樣的嗎? –

+0

是的,訪問每個元素尋找'_id'鍵,然後更新... –

+0

不,我會生成新的uuids。我如何遍歷所有嵌套字典和數組? – bluewa

回答

0

下面是Python: Recommended way to walk complex dictionary structures imported from JSON?

s = { 
    '_id': 'uuid1', 
    'languages': { '_id':'uuid2' }, 
    'experiences': { 
     '_id':'uuid3', 
     'values': [ { '_id':'uuid4' } ], 
     'responsibilities': { 
      '_id':'uuid5', 
      'values': [ { '_id':'uuid6' } ] 
     } 
    } 
} 

def walk(node): 
    if type(node) == type([]): 
     for item in node: 
      walk(item) 
    elif type(node) == type({}): 
     for key, item in node.items(): 
      if type(item) in (type([]),type({})): 
       walk(item) 
      else: 
       if key == '_id': 
        node[key] = 'xxx' # whatever you like 

walk(s) 

from pprint import pprint 
pprint(s) 

啓發腳本輸出

{'_id': 'xxx', 
'experiences': {'_id': 'xxx', 
       'responsibilities': {'_id': 'xxx', 
             'values': [{'_id': 'xxx'}]}, 
       'values': [{'_id': 'xxx'}]}, 
'languages': {'_id': 'xxx'}} 
0

您可以遞歸地解決這個問題是這樣的:

def updateData(data, newIDs): 
    for key in data: 
     if key == "_id": 
      if data[key] in newIDs: 
       data[key] = newIDs[data[key]] 
     if isinstance(data[key], dict): 
      updateData(data[key], newIDs) 

你必須提供具有改變作爲第一個參數的字典,它代表了_id S的應該改變爲第二字典參數。否則,你也可以更換第二字典,一個將被稱爲爲每個節點生成新_id這樣的功能:

def updateData(data, idGenerator): 
    for key in data: 
     if key == "_id": 
      if data[key] in newIDs: 
       data[key] = idGenerator(data[key]) 
     if isinstance(data[key], dict): 
      updateData(data[key], newIDs) 

你選擇哪種方式取決於你。

最後,你可以調用這個方法的第一個版本:

idUpdate = {"uuid1":"ooid1", "uuid2":"ooid2", "uuid3":"ooid3", 
      "uuid4":"ooid4", "uuid5":"ooid5", "uuid6":"ooid6"} 

updateData(data, idUpdate) 

,第二個是這樣的:

def newIdGenerator(oldID): 
    return the_new_id 
updateData(data, newIdGenerator)