Đối tượng lồng nhau python

Trong hướng dẫn ngắn này, bạn sẽ tìm hiểu cách bạn có thể truy cập dữ liệu được lồng sâu trong danh sách của python và cấu trúc dữ liệu từ điển

Bạn có thể đã gặp các lỗi sau khi làm việc với dữ liệu JSON

KeyError: 0
TypeError: list indices must be integers or slices, not str

Nếu đúng như vậy thì hướng dẫn này là dành cho bạn, vì bạn sẽ học được một số thủ thuật để đối phó với những tình huống này

Hướng dẫn này bao gồm những điều sau đây

  • Giới thiệu
  • Khái niệm cơ bản về từ điển và danh sách lập chỉ mục
  • Một ví dụ về cách bạn trích xuất dữ liệu lồng nhau
  • Một ví dụ về cách bạn trích xuất dữ liệu lồng nhau bằng một vòng lặp
  • Một mẹo để tránh sự cố chương trình (Hãy sử dụng nó một cách khôn ngoan)
  • tạm biệt

Khái niệm cơ bản về từ điển và danh sách lập chỉ mục

Từ điển chứa các cặp khóa và giá trị

a_dict = {"key": "value"}

Để lấy giá trị của khóa tương ứng, bạn đặt khóa trong ngoặc vuông sau biến từ điển, như thế này

your_dictionary[key]

hero_dict = {
'Clark': 'Superman',
'Bruce': 'Batman',
'You_reading_this_guide': 'Pythonman'
}
print(hero_dict['Clark'])
-> Superman

Tương tự, để truy cập các giá trị của danh sách, bạn cũng sử dụng dấu ngoặc vuông, nhưng thay vì cung cấp khóa, bạn sử dụng chỉ mục của mục bạn muốn, như thế này

your_list[index]

Chỉ số phải là một số nguyên

hero_list = ['Superman', 'Batman', 'Pythonman']print(hero_list[0])
-> Superman

Ví dụ về cách trích xuất dữ liệu lồng nhau

Hãy xem dữ liệu JSON bên dưới. Nó đến từ một tòa nhà chung cư và có một số dữ liệu về địa chỉ của nó và các căn hộ bên trong nó. Căn hộ số 1 và 2 có 2 người ở

Dữ liệu có sẵn ở đây
https. //github. com/JacobToftgaardRasmussen/medium_nested_data

Bây giờ hãy tưởng tượng rằng bạn muốn lấy tên của người đầu tiên trong căn hộ đầu tiên. Bạn sẽ viết như sau

import jsonwith open("data.json") as f:
data = json.load(f)
first_resident = data["ApartmentBuilding"]["Apartments"][0]["Residents"][0]["Name"]

Trước tiên, bạn nhập mô-đun json, điều này sẽ cho phép bạn chuyển đổi dữ liệu thành từ điển python thông qua json. hàm tải (). Tiếp theo bạn mở tệp dữ liệu và lưu dữ liệu vào biến data. Nếu bạn nhìn vào hình ảnh của dữ liệu ở trên, bạn có thể thấy rằng khóa đầu tiên là “ApartmentBuilding”. Bằng cách viết tên của khóa trong ngoặc vuông, chúng ta sẽ nhận được giá trị tương ứng là một từ điển khác. Từ điển này có hai cặp giá trị chính

  • "Địa chỉ"
  • “Căn hộ”

Trong ví dụ này, chúng tôi muốn truy cập cư dân đầu tiên trong căn hộ đầu tiên, vì vậy bạn đặt "Căn hộ" trong ngoặc vuông để nhận giá trị tương ứng, đó là danh sách. Chúng tôi làm theo điều này với 0 trong ngoặc vuông để truy cập chỉ mục đầu tiên của danh sách. Tiếp theo là “Residents”, tiếp theo là 0 khác để truy cập người đầu tiên và cuối cùng là “Name” để lấy tên của người đó

Tôi khuyến khích bạn tự mình thử. Sử dụng dữ liệu tôi đã cung cấp hoặc tạo cấu trúc dữ liệu của riêng bạn và thử duyệt qua nó

Ví dụ về cách bạn trích xuất dữ liệu lồng nhau bằng một vòng lặp

Bây giờ hãy tưởng tượng rằng bạn không chỉ quan tâm đến tên của cư dân đầu tiên, mà thay vào đó, bạn muốn tên của tất cả những cư dân đó. Nếu bạn chỉ nhìn vào dữ liệu, bạn có thể nhanh chóng thấy rằng đó sẽ là danh sách sau. [Bob, Alice, Jane, William]
Đây là cách bạn có thể nhận được kết quả đó bằng mã

import jsonwith open("data.json") as f:
data = json.load(f)
resident_names = []apartments = data['ApartmentBuilding']['Apartments']
for apartment in apartments:
residents = apartment['Residents']
for resident in residents:
name = resident['Name']
resident_names.append(name)
print(resident_names)
-> ['Bob', 'Alice', 'Jane', 'William']

Được rồi, hãy đi qua từng dòng một. Giống như trước khi chúng ta bắt đầu bằng cách nhập mô-đun json và dữ liệu. Tuy nhiên, lần này, chúng tôi cũng khởi tạo danh sách rỗng Resident_names để lưu tên trong. Nếu bạn nhìn vào dữ liệu, bạn sẽ thấy rằng hai cấp độ đầu tiên của dữ liệu là từ điển, do đó chúng tôi sử dụng các khóa “Tòa nhà căn hộ” và “Căn hộ” trong ngoặc vuông và lưu giá trị tương ứng vào biến căn hộ. Biến này hiện là một danh sách chứa tất cả các căn hộ

Vì chúng tôi muốn đi qua tất cả các căn hộ, chúng tôi sử dụng vòng lặp for. Trong mỗi lần lặp của vòng lặp, chúng tôi lưu danh sách cư dân của căn hộ đó trong biến cư dân. Sau đó, chúng ta lại có thể sử dụng một vòng lặp để đi qua tất cả cư dân của căn hộ hiện tại đó. Đây được gọi là vòng lặp kép và bạn có thể hơi khó hiểu khi lần đầu tiên nhìn thấy nó, nhưng đừng lo, bạn sẽ học được theo thời gian và thực hành

Được rồi, bạn hiện đang duyệt lần lượt qua tất cả các căn hộ và đối với mỗi căn hộ, bạn sẽ duyệt qua các cư dân của căn hộ đó. Bây giờ, bước cuối cùng là thêm tên của từng cư dân vào danh sách Resident_names. Chúng tôi truy cập tên của cư dân bằng khóa Tên Tên và lưu giá trị vào tên biến. Sau đó, chúng tôi sử dụng phương thức append() và chuyển tên cho nó. Append() là tiêu chuẩn trên tất cả các danh sách python và nó chỉ cần thêm bất cứ thứ gì bạn cung cấp vào cuối danh sách
Nếu bạn in danh sách, bạn sẽ thấy kết quả như chúng ta mong đợi

Bạn đã làm rất tốt. Bây giờ bạn đã biết cách truy cập dữ liệu lồng nhau

Một mẹo để tránh sự cố chương trình

Đôi khi khi làm việc với từ điển, bạn không thể chắc chắn rằng một khóa thực sự có trong từ điển. Hãy tưởng tượng rằng trong dữ liệu trên, một trong những độ tuổi của cư dân không được ghi lại trong dữ liệu. Vì một số lý do không rõ, khóa “Tuổi” không phải là từ điển với “Bob”

Và giả sử rằng bây giờ bạn muốn lấy danh sách độ tuổi của tất cả cư dân trong tất cả các căn hộ. Mã sẽ giống hệt như trong ví dụ trước, ngoại trừ việc chúng ta sẽ sử dụng khóa “Tuổi” ở bước cuối cùng thay vì “Tên”

Nhưng điều này sẽ không hoạt động… Tập lệnh sẽ bị lỗi…
Và bạn sẽ được gặp

File "c:\Users\your_directory\nested_data.py", line 25, in 
resident_ages.append(resident['Age'])
KeyError: 'Age'

KeyError đáng sợ…

Nhưng đây thực sự là thông tin rất có giá trị, vì thông báo lỗi cho chúng tôi biết rằng khóa 'Tuổi' không tồn tại trong từ điển nơi chúng tôi đang tìm kiếm nó. Tuy nhiên, chúng tôi vẫn muốn chương trình tiếp tục chạy và tìm tất cả các tên khác. Có lẽ chúng tôi cũng muốn tập lệnh thêm giá trị mặc định bất cứ khi nào không tìm thấy độ tuổi. Điều này có thể được thực hiện với chức năng get() tiêu chuẩn trên từ điển python
Hãy xem mã bên dưới, tôi đã thực hiện các thay đổi được in đậm

import jsonwith open("data_bob_no_age.json") as f:
data = json.load(f)

resident_ages = []
apartments = data['ApartmentBuilding']['Apartments']
for apartment in apartments:
residents = apartment['Residents']
for resident in residents:
age = resident.get('Age', 'N/A')
resident_ages.append(age)
print(resident_ages)
-> ['N/A', 42, 43, 42]

Các hàm get() nhận hai đối số, khóa mà bạn đang mong đợi và một giá trị mặc định sẽ được trả về nếu không có khóa
Như bạn có thể thấy, danh sách Resident_ages chứa giá trị 'N/A' ở chỉ mục đầu tiên và tập lệnh không bị lỗi

Sử dụng get() có thể hữu ích trong các tình huống như ở trên, nhưng hãy nhớ sử dụng nó một cách thận trọng, vì bạn sẽ không nhận được thông báo lỗi có thể quan trọng đối với hiểu biết của bạn về cấu trúc dữ liệu