计算任意嵌套列表中值的存在次数

时间:2015-11-17 06:19:45

标签: python nested-lists

我有这样的json数据:

{
    "children": [{
                "objName": "Sprite1",
                "scripts": [[89, 68, [["whenGreenFlag"], ["doForever", [["doIf", ["keyPressed:", "space"], [["wait:elapsed:from:", 0.5], ["playSound:", "meow"]]],
                                    ["doIf", ["mousePressed"], [["playDrum", 1, 0.25]]]]]]]],
                "sounds": [{
                        "soundName": "meow",
                        "soundID": 0,
                        "md5": "83c36d806dc92327b9e7049a565c6bff.wav",
                        "sampleCount": 18688,
                        "rate": 22050,
                        "format": ""
                    }],

        }
}

我想计算“脚本”下“keyPressed”的出现次数。但我不知道如何在“脚本”下遍历列表列表....

这是我的代码:

import simplejson as json

with open("D:\\1.SnD\Work\PyCharmProjects\project.json", 'rb') as f:
    json_data = json.loads(str(f.read(), 'utf-8'))
    key_presses = []
    for child in json_data.get('children'):
        for script in child.get('scripts'):
            for mouse in script.get("keyPressed"): // Does not work
                print(mouse)

我想将keyPressed的计数存储在key_presses列表中。

1 个答案:

答案 0 :(得分:1)

What is the fastest way to flatten arbitrarily nested lists in Python?借用优秀的flatten方法并将其与集合中的Counter相结合,您得到:

import collections, json

def flatten(container):
    for i in container:
        if isinstance(i, list) or isinstance(i, tuple):
            for j in flatten(i):
                yield j
        else:
            yield i

with open("D:\\1.SnD\Work\PyCharmProjects\project.json", 'rb') as f:
    json_data = json.loads(str(f.read(), 'utf-8'))

print(collections.Counter(
       flatten(json_data['children'][0]['scripts']))['keyPressed:'])

如果您运行上述内容,则输出将是脚本中keyPressed:出现的次数。