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

时间:2016-01-30 00:02:59

标签: python pygame

我和几个朋友正在使用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

2 个答案:

答案 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)