2016-01-22 15 views
6

Mam plik z danymi JSON w nim, tak jak poniżej:Problemy z iterowaniem za pośrednictwem listy JSON w języku 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"} 
      }] 
} 

nie mogę dowiedzieć się, jak prawidłowo pętli JSON. Chciałbym przejrzeć dane i uzyskać nazwę z samochodami dla każdego członka w zestawie danych. Jak mogę to zrobić?

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 

Próbowałem zapętlenie przez nich z:

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

Ale odbieranie błąd: TypeError: indeksy liście muszą być liczbami całkowitymi, nie dict

+1

'for i in danych [„Wyniki”]: I [" Nazwa "]' –

+1

Jeśli zrozumiałem cię poprawnie, chcesz: '{person ['Name']: person ['Items'] ['Cars'] dla osoby w danych [" Wyniki "]}'. – pzp

Odpowiedz

13

Jesteś zakładając, że i jest indeks, ale jest to słownik, użyj:

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

Cytat z 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

To ma sens, dzięki za szybką odpowiedź !! Nadal nie jestem pewien, w jaki sposób przechodziłbym przez pod-obiekt dla każdego z nich? – Bajan

+2

@Bajan jasne, zakładając, że masz na myśli słownik 'Items': dla klucza, wartość w pozycji [" Items "]. Iteritems():'. Zobacz pokrewne tematy: https://docs.python.org/2/tutorial/datastructures.html#dictionaries, http://stackoverflow.com/questions/3294889/iterating-over-dictionaries-using-for-loops- w-python. – alecxe

+1

Jesteś szybki! Zrobiłem to za pomocą tego: 'dla pozycji w danych [" Wyniki "]: pozycja drukowania [" Przedmioty "] [" Samochody "]' Która metoda byłaby zalecana? – Bajan

3

jesteś iteracja słownik nie indeksuje więc powinny albo stosować.

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

lub

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

Zamieszanie jest w jak słowniki i listy są używane w iteracji. Słownik będzie iterować to klucze (które można wykorzystać jako wskaźników, aby uzyskać odpowiednie wartości)

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) 

ale domyślne zachowanie iteracji na liście daje elementy zamiast indeksów:

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) 

Jeśli chcesz uogólniać program obsługiwać oba typy w ten sam sposób można użyć jednej z tych funkcji:

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

ten sposób, jeśli dla Przykładem, później zmienił JSON do przechowywania wyników w dict użyciu identyfikatora jako kluczy program będzie nadal iterację go w ten sam sposób:

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

#or 
for i in indices(data["Results"]): 
    print(data["Results"][i]["name"]) 
Powiązane problemy