2015-08-03 15 views
5

Xin lỗi trước cho điều này là một câu hỏi newbie như vậy. Tôi chỉ mới bắt đầu viết python và tôi đã có một số nhầm lẫn xung quanh giá trị popping từ từ điển lồng nhau/danh sách vì vậy tôi đánh giá cao sự giúp đỡ nào!python lồng nhau danh sách/từ điển và popping giá trị

Tôi có mẫu này json dữ liệu:

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

tôi muốn bật 'id' ra khỏi "quét" chìa khóa.

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) 

dường như không hoạt động vì khóa/giá trị lồng nhau nằm trong danh sách. tức là

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

bất kỳ ai có thể chỉ cho tôi đúng hướng để làm việc này không? mục tiêu dài hạn của tôi với điều này là tạo ra một vòng lặp mà đặt tất cả các id vào một từ điển hoặc danh sách khác mà tôi có thể sử dụng cho một hàm khác.

+0

từ nhận xét cuối cùng của bạn có vẻ như bạn đã có một ý tưởng hay về những việc cần làm. Tại sao không thử viết mã và cho chúng tôi thấy nỗ lực của bạn? – goncalopp

+0

figured tôi muốn không nổ thread này với một triệu ví dụ không thành công của những gì tôi đã cố gắng để giữ cho mọi thứ ngắn gọn cho độc giả trong tương lai có một vấn đề tương tự. – dobbs

Trả lời

2

json_data['scans'] trả về một danh sách các dicts, bạn đang cố gắng index danh sách sử dụng một str tức []["id"] mà thất bại vì những lý do rõ ràng, do đó bạn cần phải sử dụng các chỉ số để nhận được mỗi subelement:

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

Hoặc để xem tất cả lặp của id qua danh sách của dicts trả về bằng json_data["scans"]:

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

để tiết kiệm thêm vào sau một danh sách:

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

Hoặc sử dụng một danh sách comp:

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

Nếu có một cơ hội phím id có thể không có trong mỗi dict, sử dụng in để kiểm tra trước khi bạn truy cập vào:

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

hoàn hảo! tôi đã mất vị trí lập chỉ mục danh sách sau khi ['quét']. có ý nghĩa bây giờ. Tôi là loại nhầm lẫn trên ví dụ thứ hai mặc dù. : print (d ["id"]) là vị trí chỉ mục? tôi nghĩ bạn phải đặt các vị trí chỉ mục bên trong dấu ngoặc để bật các giá trị – dobbs

+0

@dobbs, chúng tôi đang lặp qua danh sách trong vòng lặp để mỗi 'd' là mỗi phần tử' thực tế 'từ danh sách để chúng ta truy cập vào dict bằng khóa 'id' để nhận được mỗi giá trị –

0

đây như thế nào có thể bạn lặp qua các mục và trích xuất tất cả các id:

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

Cách tiếp cận này cũng sẽ hoạt động:

ids = [item.pop('id') for item in json_data['scans']] 
Các vấn đề liên quan