2015-08-03 13 views
5

Przeprosiny z góry za to, że takie pytanie dla początkujących. Właśnie zaczynam pisać Pythona i mam pewne zamieszanie wokół pojawiania się wartości z zagnieżdżonych słowników/list, więc doceniam każdą pomoc!Python zagnieżdżonych list/słowników i wartości popping

mam ten przykładowy danych json:

{ "scans": [ 
    { "status": "completed", "starttime": "20150803T000000", "id":533}, 
    { "status": "completed", "starttime": "20150803T000000", "id":539} 
] } 

chciałbym pop „identyfikator” z klucza „skanów”.

def listscans(): 
    response = requests.get(scansurl + "scans", headers=headers, verify=False) 
    json_data = json.loads(response.text) 
    print json.dumps(json_data['scans']['id'], indent=2) 

wydaje się działać, ponieważ zagnieżdżone klucze/wartości znajdują się na liście. tj.

>>> print json.dumps(json_data['scans']['id']) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: list indices must be integers, not str 

Czy ktoś może wskazać mi właściwy kierunek, aby to zadziałało? moim długoterminowym celem jest stworzenie pętli for, która umieszcza wszystkie identyfikatory w innym słowniku lub liście, której można użyć do innej funkcji.

+0

z Twojego ostatniego komentarza wydaje się, że masz już całkiem niezłe pojęcie o tym, co należy zrobić. Dlaczego nie spróbować go zakodować i pokazać nam swoją próbę? – goncalopp

+0

Uznałem, że nie rozwalę tego wątku z milionem nieudanych przykładów tego, co starałem się zachować zwięzłość dla przyszłych czytelników, którzy mają podobny problem. – dobbs

Odpowiedz

2

json_data['scans'] zwraca listę dicts, próbujesz indeksu listę używając STR tj []["id"] które nie z oczywistych względów, więc trzeba korzystać z indeksu, aby każdy podelement:

print json_data['scans'][0]['id'] # -> first dict 
print json_data['scans'][1]['id'] # -> second dict 

czy zobaczyć wszystko iterate identyfikator nad listy dicts zwracane przy użyciu json_data["scans"]:

for dct in json_data["scans"]: 
    print(dct["id"]) 

aby zapisać dołączyć do listy:

all_ids = [] 
for dct in json_data["scans"]: 
    all_ids.append(dct["id"]) 

Albo użyć listy komp:

all_ids = [dct["id"] for dct in json_data["scans"]] 

Jeśli istnieje szansa kluczem id może nie być w każdym dict, użyj in sprawdzić przed uzyskaniem dostępu:

all_ids = [dct["id"] for dct in json_data["scans"] if "id" in dct] 
+0

idealne! Nie znalazłem pozycji indeksującej listy po ["skanach"]. ma sens teraz. Jestem jednak trochę zdezorientowany na drugim przykładzie. the: print (d ["id"]) jest d pozycji indeksu? Myślałem, że musisz umieścić pozycje indeksu wewnątrz nawiasów, aby pop wartości – dobbs

+0

@dobbs, jesteśmy iteracyjne nad listą w pętli, więc każdy 'd' jest każdym faktycznym' elementem/dict' z listy, więc uzyskujemy dostęp do dyktatury przez klucz 'id', aby uzyskać każdą wartość –

0

Oto w jaki sposób można możesz iterować po elementach i wyodrębnić wszystkie identyfikatory:

json_data = ... 
ids = [] 
for scan in json_data['scans']: 
    id = scan.pop('id') 
    # you can use get instead of pop 
    # then your initial data would not be changed, 
    # but you'll still have the ids 
    # id = scan.get('id') 
    ids.append(); 

Takie podejście też zadziała:

ids = [item.pop('id') for item in json_data['scans']] 
Powiązane problemy