2017-08-16 152 views
0

更新場我有一個字典,像這樣:查找和嵌套字典在Python

mobs = { 
    'world': { 
     0: {'mID': 255, 'xPos': 29, 'yPos': 45} 
     1: {'mID': 784, 'xPos': 34, 'yPos': 84} 
     }, 
    'village': { 
     0: {'mID': 256, 'xPos': 77, 'yPos': 25} 
     1: {'mID': 67, 'xPos': 92, 'yPos': 16} 
     2: {'mID': 998, 'xPos': 8, 'yPos': 5} 
     }, 
    } 

我要遞增xPos其中mID = X在「世界」快譯通,但不知道如何爲指向它

我必須遍歷world中的每條記錄並檢查if mID = x,還是有更快的方法?

(更新)

x = 784 
for row in mobs['world']: 
    if mobs['world'][row]['ID'] == x: 
     mobs['world'][row]['xPos'] -= 1 
+2

也許你應該重新安排結構。中間字典看起來更像是一個列表,如果你通過'mID'訪問這些項目,它可能是一個很好的字典鍵。 –

+0

是的,如果你不想重新構造'dictionary',你必須循環遍歷,但是你爲這個任務所做的代碼將不起作用。 –

回答

0

如果你的變化僅適用於world子快譯通,你可以這樣做:

x = 784 
for key, value in mobs['world'].items(): 
    if value['mID'] == x: 
     mobs['world'][key]['xPos'] += 1 

輸出:

>>> from pprint import pprint 
>>> 
>>> mobs = { 
...  'world': { 
...   0: {'mID': 255, 'xPos': 29, 'yPos': 45}, 
...   1: {'mID': 784, 'xPos': 34, 'yPos': 84} 
...  }, 
...  'village': { 
...   0: {'mID': 256, 'xPos': 77, 'yPos': 25}, 
...   1: {'mID': 67, 'xPos': 92, 'yPos': 16}, 
...   2: {'mID': 998, 'xPos': 8, 'yPos': 5} 
...  }, 
... } 
>>> 
>>> x = 784 
>>> for key, value in mobs['world'].items(): 
...  if value['mID'] == x: 
...   mobs['world'][key]['xPos'] += 1 
... 
>>> pprint(mobs) 
{'village': {0: {'mID': 256, 'xPos': 77, 'yPos': 25}, 
      1: {'mID': 67, 'xPos': 92, 'yPos': 16}, 
      2: {'mID': 998, 'xPos': 8, 'yPos': 5}}, 
'world': {0: {'mID': 255, 'xPos': 29, 'yPos': 45}, 
      1: {'mID': 784, 'xPos': 35, 'yPos': 84}}} 
+1

在這個答案中,增加'xPos'的代碼比它需要的複雜一點;代碼已經在'value'中有了字典,爲什麼不簡單地執行'value ['xPos'] + = 1'? – mhawke

0

使用您給出數據結構你需要遍歷字典爲了測試mID並增加了xPos。字典可以代替使用這個簡單的代碼進行更新:

x = 784 

for mob in mobs['world'].values(): 
    if mob['mID'] == x: 
     mob['xPos'] += 1 

此迭代的值包含在mobs['world']字典的,所述mID比較針對所述目標值,和增量xPos當存在匹配。增量是有效的,因爲字典是可變的。