2017-03-28 4 views
1

Im Moment habe ich eine for Schleife, die eins nach dem anderen nach dem Schlüsselwert == einer Variablen sucht.Schleifen durch alle JSON-Kinder

Ich mache dies eins nach dem anderen, indem Sie die [0] und [1] Index auswählen, um die ersten beiden Kinder zu bekommen. Es könnte bis zu vier Kinder geben, gibt es eine effizientere Möglichkeit, dies zu tun als elif?

# INITIALIZE NEW FILTERED DICTIONARY (RETAINING TOP LEVEL ITEMS) 
    newdata = OrderedDict({k:v for k,v in data.items() if k in ['stop_id', 'stop_name']}) 
    newdata['mode'] = [] 
    arrivalarray = [] 

    # ITERATE CONDITIONALLY KEEPING NEEDED SECTIONS 
    for i in data['mode']: 
     if i['route'][0]['route_name'] == line: 
      if i['route'][0]['direction'][0]['direction_name'] == direction: 
       for s in i['route'][0]['direction'][0]['trip']: 
        arrivalarray.append(s['pre_away']) 
      elif i['route'][0]['direction'][1]['direction_name'] == direction: 
       for s in i['route'][0]['direction'][1]['trip']: 
        arrivalarray.append(s['pre_away']) 

Antwort

0

Sobald Sie die JSON-Daten geladen haben, handelt es sich nicht mehr um JSON-Daten. Es ist nur eine verschachtelte Reihe von Python-Listen, Dicts, Strings usw. Als solche können Sie das tun, was Sie für jede Python-Datenstruktur tun würden, wie zum Beispiel eine for-Schleife zum Iterieren über die Elemente einer Liste:

for d in i['route'][0]['direction']: 
    if d['direction_name'] == direction: 
     for s in d['trip']: 
      arrivalarray.append(s['pre_away']) 
0

Nun ja, Sie könnten Rekursion statt Iteration verwenden und das ist tatsächlich, was DFS ist.

def traverse_json(json, depth): 
    if depth = 0 : 
     return []; 
    else: 
     data = []; 
     for i in json.keys(): 
      if isinstance(json[i], dict): 
        data += traverse_json(json[i], depth -1) 
      else : 
        data.append(json[i]) 
     return data 

Sie könnten mit der maximalen Tiefe beginnen, die Sie benötigen.

Verwandte Themen