我和几个朋友正在使用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
..等等,我想出了这个(到目前为止)
for key in dbgKeys:
if len(dbgValues[key]) > 2: #if there are more then 2 key/value pairs in each primary dictionary key
for subKey in dbgValues[key]: #iterate thru all of the subkeys in dbgValues[key] -> dbgValues[key][subKey}]
else:
self.valueLine = '%s: %s' % (dbgValues[key]['name'],dbgValues[key]['value'])
self.dbgText = self.text.render(self.valueLine, True, fontColor)
我想出了一种方法来迭代所有的subKey值而没有很多凌乱的if / for循环和丑陋的concats。通过子键进行迭代的最佳方法是什么,并且还可以为变量分配/格式化(例如" self.valueLine'),看起来像这样?
example = (dbgValues[key]['name'],dbgValues[key]['playerX'],dbgValues[key]['playerY'])
example output:
playerPos: X>000 Y>000
答案 0 :(得分:0)
这就是你要找的东西。内嵌循环遍历嵌套字典的键。提供的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
答案 1 :(得分:0)
如果我理解你,那么这应该有效:
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)