2017-08-16 101 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当存在匹配。增量是有效的,因为字典是可变的。