2016-01-22 11 views
6

Ich habe eine Datei mit JSON-Daten in ihm, etwa so:Probleme beim Iterieren der JSON-Liste in Python?

{ 
    "Results": [ 
      {"Id": "001", 
      "Name": "Bob", 
      "Items": { 
       "Cars": "1", 
       "Books": "3", 
       "Phones": "1"} 
      }, 

      {"Id": "002", 
      "Name": "Tom", 
      "Items": { 
       "Cars": "1", 
       "Books": "3", 
       "Phones": "1"} 
      }, 

      {"Id": "003", 
      "Name": "Sally", 
      "Items": { 
       "Cars": "1", 
       "Books": "3", 
       "Phones": "1"} 
      }] 
} 

Ich kann nicht herausfinden, wie durch die JSON richtig Schleife. Ich möchte die Daten durchschleifen und einen Namen mit den Autos für jedes Mitglied im Datensatz erhalten. Wie kann ich das erreichen?

import json 

with open('data.json') as data_file: 
    data = json.load(data_file) 

print data["Results"][0]["Name"] # Gives me a name for the first entry 
print data["Results"][0]["Items"]["Cars"] # Gives me the number of cars for the first entry 

Ich habe versucht, mit durch sie Looping:

for i in data["Results"]: 
print data["Results"][i]["Name"]  

Aber recieve einen Fehler: Typeerror: Liste Indizes müssen ganze Zahlen sein, Dict nicht

+1

'für i in data [„Ergebnisse“]: i [" Name der "]' –

+1

Wenn ich dich richtig verstanden habe, willst du: '{Person ['Name']: Person ['Items'] ['Cars'] für Person in Daten [" Results "]}'. – pzp

Antwort

13

Sie davon aus, dass i ist ein Index, aber es ist ein Wörterbuch, verwenden Sie:

for item in data["Results"]: 
    print item["Name"]  

Zitat aus dem for Statements:

The for statement in Python differs a bit from what you may be used to in C or Pascal. Rather than always iterating over an arithmetic progression of numbers (like in Pascal), or giving the user the ability to define both the iteration step and halting condition (as C), Python’s for statement iterates over the items of any sequence (a list or a string), in the order that they appear in the sequence.

+0

Das macht jetzt Sinn, danke für deine schnelle Antwort !! Ich bin immer noch unsicher, wie ich das Unterobjekt für jedes einzelne durchschleifen würde? – Bajan

+2

@Bajan sicher, vorausgesetzt, Sie meinen das 'Items' Wörterbuch:' für Schlüssel, Wert in item ["Items"]. Iseritems(): '. Bitte beachten Sie die verwandten Themen: https://docs.python.org/2/tutorial/datastructures.html#dictionaries, http://StackOverflow.com/questions/3294889/iterating-over-dictionaries-using-for-loops- In-Python. – alecxe

+1

Sie sind schnell! Ich habe es getan, indem Sie dies verwenden: 'für Artikel in Daten [" Ergebnisse "]: Drucken Artikel [" Artikel "] [" Autos "]' Welche wäre die empfohlene Methode? – Bajan

3

Sie das Wörterbuch iterieren durch keine Indizes, so dass Sie sollten entweder.

for item in data["Results"]: 
    print item["Name"]  

oder

for i in range(len(data["Results"])): 
    print data["Results"][i]["Name"] 
2

Die Verwirrung ist in, wie Wörterbücher und Listen in Iteration verwendet werden. Ein Wörterbuch wird iterieren es Tasten (die Sie als Indizes verwenden entsprechenden Werte zu erhalten)

x = {"a":3, "b":4, "c":5} 
for key in x: #same thing as using x.keys() 
    print(key,x[key]) 

for value in x.values(): 
    print(value)  #this is better if the keys are irrelevant  

for key,value in x.items(): #this gives you both 
    print(key,value) 

aber das Standardverhalten über eine Liste von Iterieren geben Sie die Elemente anstelle der Indizes:

y = [1,2,3,4] 
for i in range(len(y)): #iterate over the indices 
    print(i,y[i]) 

for item in y: 
    print(item) #doesn't keep track of indices 

for i,item in enumerate(y): #this gives you both 
    print(i,item) 

wenn Sie Ihr Programm verallgemeinern, beide Arten zu handhaben die gleiche Art und Weise Sie eine dieser Funktionen verwenden:

def indices(obj): 
    if isinstance(obj,dict): 
     return obj.keys() 
    elif isinstance(obj,list): 
     return range(len(obj)) 
    else: 
     raise TypeError("expected dict or list, got %r"%type(obj)) 

def values(obj): 
    if isinstance(obj,dict): 
     return obj.values() 
    elif isinstance(obj,list): 
     return obj 
    else: 
     raise TypeError("expected dict or list, got %r"%type(obj)) 

def enum(obj): 
    if isinstance(obj,dict): 
     return obj.items() 
    elif isinstance(obj,list): 
     return enumerate(obj) 
    else: 
     raise TypeError("expected dict or list, got %r"%type(obj)) 

diese Weise, wenn Sie, für Beispiel änderte später die json die Ergebnisse in einem dict speichern die ID als Schlüssel mit dem Programm würde immer noch die gleiche Art und Weise durchlaufen:

#data = <LOAD JSON> 
for item in values(data["Results"]): 
    print(item["name"]) 

#or 
for i in indices(data["Results"]): 
    print(data["Results"][i]["name"]) 
Verwandte Themen