通过字典子键/子值对迭代-Python

通过字典子键/子值对迭代-Python,python,pygame,Python,Pygame,我和几个朋友正在用Pygame制作一个游戏。我正在开发一种调试控制台。现在它是超基本的,一点也不新奇。所谓的“值”存储在字典中(现在这些值是固定的,直到我让它按我想要的方式工作为止)。那本字典是这样的: dbgValues = {'mouseAngle': {'name': 'mouseAngle','value': '000.000'}, 'playerPos': {'name': 'playerPos', 'playerX': 'X>000', 'pla

我和几个朋友正在用Pygame制作一个游戏。我正在开发一种调试控制台。现在它是超基本的,一点也不新奇。所谓的“值”存储在字典中(现在这些值是固定的,直到我让它按我想要的方式工作为止)。那本字典是这样的:

dbgValues = 
       {'mouseAngle': {'name': 'mouseAngle','value': '000.000'},
        'playerPos': {'name': 'playerPos', 'playerX': 'X>000', 'playerY':'Y>000'},
        'cursor': { 'name': 'cursor', 'cursX': 'X>000','cursY': 'Y>000'},
        'bulletAngle': {'name': 'bulletAngle', 'value': '000.000'},
        'distToMouse': {'name': 'distToMouse', 'value': '000.000'}
        }#dict end
然后,为了便于以后使用:

for key in dbgValues.keys(): #create a list of keys only for lateruse
    dbgKeys.append(key)
    dbgKeys.sort()
如您所见,一些“主键”只有2个子键。我能应付的。 但也有一些有3个(未来可能会有更多)。为了避免类似的事情:

if len(dbgValues[key] > 2:
   do something
elif len(dbgValues[key] > 3:
   do other thing
。。等等,我想出了这个(到目前为止)

我找到了一种迭代所有子键值的方法,而不会有很多杂乱的if/for循环和难看的concat。通过子键进行迭代,并将变量(例如“self.valueLine”)赋值/格式化为如下形式的最佳方法是什么

example = (dbgValues[key]['name'],dbgValues[key]['playerX'],dbgValues[key]['playerY'])
example output:
playerPos: X>000 Y>000

这就是您要查找的。嵌套字典的键上有一个内部for循环。提供的valueLine打印键和值

dbgValues = \
{'mouseAngle': {'name': 'mouseAngle','value': '000.000'},
'playerPos': {'name': 'playerPos', 'playerX': 'X>000', 'playerY':'Y>000'},
'cursor': { 'name': 'cursor', 'cursX': 'X>000','cursY': 'Y>000'},
'bulletAngle': {'name': 'bulletAngle', 'value': '000.000'},
'distToMouse': {'name': 'distToMouse', 'value': '000.000'}
}#

sorted_keys = sorted(dbgValues) #automatically sorts the keys in alphabetically order

for key in sorted_keys:
    print key
    valueLine = ""
    for inner_key in  sorted(dbgValues[key]):
        valueLine += "%s : %s, " %(inner_key, dbgValues[key][inner_key])
    print valueLine
    print '-'*20

如果我理解你的意思,那么这应该是可行的:

self.valueLine = []
for key in dbgKeys:
    self.valueLine.append('{} => '.format(dbgValues[key]['name']))
    self.valueLine.extend(['{} '.format(value) for subkey, value in dbgValues[key].items() if subkey != 'name'])
    self.valueLine.append('\n')

self.valueLine = ''.join(self.valueLine)
self.dbgText = self.text.render(self.valueLine, True, fontColor)

啊,是的。这似乎满足了我的需要。稍微调整一下就可以了。必须在for循环中加入'valueLine=[],否则会引发异常。谢谢!在for循环中?这不是在每次迭代后都会清除列表吗?你得到了什么异常?
self.valueLine = []
for key in dbgKeys:
    self.valueLine.append('{} => '.format(dbgValues[key]['name']))
    self.valueLine.extend(['{} '.format(value) for subkey, value in dbgValues[key].items() if subkey != 'name'])
    self.valueLine.append('\n')

self.valueLine = ''.join(self.valueLine)
self.dbgText = self.text.render(self.valueLine, True, fontColor)