2015-11-17 2 views
0

У меня есть данные 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

Заимствуя отличный flatten метод из What is the fastest way to flatten arbitrarily nested lists in Python? и сочетая его с 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: появляется в сценариях.

+0

Спасибо большое, это сработало отлично! – Retr0spect