Thông thường, để truy cập các giá trị trong từ điển, tôi cần đảm bảo và tham khảo rất cụ thể tất cả các giá trị phù hợp không có lỗi chính tả. Nếu tôi muốn lấy giá trị được lưu trong khóa
my_obj.nested_value.n1
1, tôi cần gõ chính xácmy_dict['nested_value']['n1']
Vì hầu hết thời gian tôi làm việc trong Jupyter, nên tôi tận dụng lợi thế của việc hoàn thành và xem xét nội tâm để khám phá các thuộc tính và tránh lỗi chính tả. Từ điển Python không giúp ích nhiều cho việc này, nhưng các Đối tượng Python thì có. Điều này đặt ra một cách hợp lý câu hỏi, làm thế nào để tạo hệ thống phân cấp đối tượng lồng nhau để tôi có thể truy cập cùng một giá trị bằng cú pháp dấu chấm
my_dict.nested_value.n1
Mặc dù với các từ điển đơn giản, đây không phải là vấn đề lớn, nhưng khi làm việc với các phản hồi từ các điểm cuối REST, các thông báo JSON được trả về có thể rất lớn. Truy cập dễ dàng hơn vào tất cả các thuộc tính làm cho cuộc sống dễ dàng hơn rất nhiều. Khai báo đối tượng nhỏ sau đây có thể được sử dụng để chuyển đổi các từ điển được lồng sâu thành các đối tượng lồng nhau
class DictObj:
def __init__[self, in_dict:dict]:
assert isinstance[in_dict, dict]
for key, val in in_dict.items[]:
if isinstance[val, [list, tuple]]:
setattr[self, key, [DictObj[x] if isinstance[x, dict] else x for x in val]]
else:
setattr[self, key, DictObj[val] if isinstance[val, dict] else val]
Điều này giúp việc tìm hiểu các phản hồi JSON sâu từ các điểm cuối REST dễ dàng hơn rất nhiều. Bắt đầu đủ đơn giản, từ điển trên được chuyển đổi thành một đối tượng lồng nhau
my_obj = DictObt[my_dict]
Sau đó, việc truy cập các thuộc tính đơn giản như sử dụng cú pháp dấu chấm
my_obj.nested_value.n1
Vì đây là điều mà tôi thường xuyên gặp phải khi đào sâu vào JSON từ các phản hồi REST, nên tôi sẽ sử dụng Luồng thời gian thực của USGS làm ví dụ trong thế giới thực
import requests
url = '//waterservices.usgs.gov/nwis/iv/'
params = {
'format': 'json',
'sites': '12080010',
'parameterCd': '00060',
'siteStatus': 'all'
}
# retrieve the most recent real time streamflow observations
res = requests.get[url, params=params]
# convert the json body into a dictionary
res_json = res.json[]
# convert the json to a nested object
res_obj = DictObj[res_json]
# dig deep into the response to get the most recent [last in list] value
str_obs = res_obj.value.timeSeries[-1].values[-1].value[-1].value
# since stuck as a string, convert to an integer, and done!
int_obs = int[str_obs]
Thủ thuật nhỏ này đã giúp cuộc sống của tôi dễ dàng hơn rất nhiều khi xử lý JSON rối rắm quay trở lại từ các điểm cuối REST. Hy vọng rằng, nó cũng làm cho cuộc sống của bạn dễ dàng hơn một chút
Từ điển Python là một tập hợp các cặp khóa-giá trị. Một từ điển là một đối tượng của lớp dict. Đó là một bộ sưu tập không có thứ tự có nghĩa là trong khi lặp lại thứ tự truy xuất không được đảm bảo. Các khóa và giá trị từ điển có thể thuộc bất kỳ loại nào. Họ cũng có thể là
>>> my_dict = {1:"1", 2:"2"} >>> del my_dict[1] >>> print[my_dict] {2: '2'} >>> del my_dict >>> print[my_dict] Traceback [most recent call last]: File "", line 1, in NameError: name 'my_dict' is not defined >>>0. Khóa và giá trị của nó được phân tách bằng dấu hai chấm. Các bản ghi từ điển được lập chỉ mục bằng cách sử dụng khóa
Mục từ điển Python
Các cặp khóa-giá trị còn được gọi là các mục hoặc thành phần của từ điển. Chúng ta có thể sử dụng dict. items[] để có thể lặp lại các mục trong từ điển. Không có hạn chế về giá trị của các mục từ điển
Khóa từ điển Python
Các phím là duy nhất trong từ điển. Nó được sử dụng để lấy các bản ghi từ từ điển. Một từ điển được tạo bằng cách sử dụng một cặp dấu ngoặc nhọn. Các cặp khóa-giá trị được phân tách bằng dấu phẩy
Khóa từ điển phải là bất biến. Vì vậy, chúng tôi có thể sử dụng chuỗi, số và bộ dữ liệu làm khóa chính tả. Nếu bộ chứa bất kỳ đối tượng có thể thay đổi nào, chúng tôi không thể sử dụng nó làm khóa từ điển
Chúng tôi có thể sử dụng Danh sách làm Khóa từ điển không?
Chúng tôi không thể sử dụng Danh sách làm khóa từ điển vì nó có thể được sửa đổi. Nếu chúng ta cố gắng sử dụng một danh sách làm khóa, nó sẽ đưa ra “TypeError. loại không thể xóa. danh sách"
Tạo từ điển
Các mục từ điển được phân tách bằng dấu phẩy và cặp khóa-giá trị được phân tách bằng dấu hai chấm. Các dấu ngoặc nhọn được sử dụng để xác định từ điển với tất cả các mục. Hãy xem một ví dụ đơn giản để tạo một từ điển và in nó
>>> fruits_dict = {"1": "Apple", "2": "Banana", 3: "Orange", None: "NA"} >>> print[fruits_dict] {'1': 'Apple', '2': 'Banana', 3: 'Orange', None: 'NA'} >>> type[fruits_dict]
Lưu ý rằng loại của lớp từ điển là
>>> my_dict = {1:"1", 2:"2"} >>> del my_dict[1] >>> print[my_dict] {2: '2'} >>> del my_dict >>> print[my_dict] Traceback [most recent call last]: File "", line 1, in NameError: name 'my_dict' is not defined >>>1 và các khóa-giá trị cũng thuộc các loại khác nhau
Truy cập các giá trị từ điển
Chúng ta có thể truy cập một giá trị từ điển bằng cách sử dụng tên khóa trong ngoặc vuông
>>> fruits_dict["1"] 'Apple' >>> fruits_dict["2"] 'Banana' >>> fruits_dict[3] 'Orange' >>> fruits_dict[None] 'NA'
Nếu khóa không tồn tại, cách này để truy cập phần tử từ điển sẽ làm tăng KeyError. Tốt hơn là sử dụng phương thức
>>> my_dict = {1:"1", 2:"2"} >>> del my_dict[1] >>> print[my_dict] {2: '2'} >>> del my_dict >>> print[my_dict] Traceback [most recent call last]: File "", line 1, in NameError: name 'my_dict' is not defined >>>2 trả về
>>> my_dict = {1:"1", 2:"2"} >>> del my_dict[1] >>> print[my_dict] {2: '2'} >>> del my_dict >>> print[my_dict] Traceback [most recent call last]: File "", line 1, in NameError: name 'my_dict' is not defined >>>0 nếu không có khóa
Thêm/Cập nhật giá trị từ điển
Chúng ta có thể thêm hoặc cập nhật các phần tử từ điển bằng toán tử gán. Nếu khóa không tồn tại trong từ điển, cặp khóa-giá trị sẽ được thêm vào từ điển. Nếu không, giá trị được cập nhật với giá trị mới
my_dict.nested_value.n1
2Xóa các mục từ điển
Chúng ta có thể sử dụng từ khóa del để xóa cặp khóa-giá trị từ điển. Nếu chúng ta sử dụng từ khóa del với từ điển thì toàn bộ từ điển sẽ bị xóa, khác với việc xóa tất cả các thành phần của từ điển
>>> my_dict = {1:"1", 2:"2"} >>> del my_dict[1] >>> print[my_dict] {2: '2'} >>> del my_dict >>> print[my_dict] Traceback [most recent call last]: File "", line 1, in NameError: name 'my_dict' is not defined >>>
Lặp lại từ điển bằng vòng lặp for
Chúng ta có thể lặp qua từ điển bằng vòng lặp for. Có nhiều cách sử dụng vòng lặp for với từ điển
1. Mục từ điển [] chức năng
Hàm items[] trả về một đối tượng dict_items, có thể lặp lại. Chúng ta có thể sử dụng nó với vòng lặp for và giải nén các phần tử của nó thành khóa và giá trị, sau đó sử dụng chúng bên trong vòng lặp for
my_dict.nested_value.n1
4đầu ra
my_dict.nested_value.n1
52. Lặp qua các phím từ điển
Nếu chúng ta sử dụng đối tượng từ điển trong vòng lặp for, nó sẽ trả về từng khóa một. Vì từ điển không có thứ tự nên các khóa được trả về có thể theo bất kỳ thứ tự nào
my_dict.nested_value.n1
6đầu ra
my_dict.nested_value.n1
73. Các giá trị từ điển Python[]
Chúng ta có thể sử dụng hàm values[] để lấy các giá trị từ điển và sau đó lặp lại chúng. Hàm values[] trả về một đối tượng dict_values, là danh sách các giá trị trong dict
my_dict.nested_value.n1
8đầu ra
my_dict.nested_value.n1
9Kiểm tra xem khóa có tồn tại trong Từ điển không
Chúng ta có thể sử dụng từ khóa “in” để kiểm tra xem từ khóa có tồn tại trong từ điển hay không. Tương tự chúng ta có thể dùng từ khóa “not in” để kiểm tra xem có thiếu key hay không
>>> fruits_dict["1"] 'Apple' >>> fruits_dict["2"] 'Banana' >>> fruits_dict[3] 'Orange' >>> fruits_dict[None] 'NA'0
Độ dài của từ điển
Chúng ta có thể sử dụng hàm len[] để tìm ra độ dài hoặc kích thước của từ điển
>>> fruits_dict["1"] 'Apple' >>> fruits_dict["2"] 'Banana' >>> fruits_dict[3] 'Orange' >>> fruits_dict[None] 'NA'1
Trình xây dựng dict[] của Python
Chúng ta có thể sử dụng hàm tạo dict[] tích hợp để tạo một đối tượng từ điển
>>> fruits_dict["1"] 'Apple' >>> fruits_dict["2"] 'Banana' >>> fruits_dict[3] 'Orange' >>> fruits_dict[None] 'NA'2
Phương pháp từ điển Python
Lớp dict Python có nhiều phương thức. Hãy xem xét một số phương thức quan trọng của lớp dict
1. giá trị[]
Phương thức này trả về một đối tượng chứa các giá trị từ từ điển. Loại đối tượng được trả về là 'dict_values' và chúng ta có thể lặp lại nó để thực hiện một số thao tác trên các giá trị từ điển
>>> fruits_dict["1"] 'Apple' >>> fruits_dict["2"] 'Banana' >>> fruits_dict[3] 'Orange' >>> fruits_dict[None] 'NA'3
2. mặt hàng[]
Phương pháp này cung cấp chế độ xem giống như tập hợp các mục Từ điển. Nó chủ yếu được sử dụng để giải nén các cặp khóa-giá trị từ điển thành các giá trị khác nhau và sau đó lặp lại chúng
>>> fruits_dict["1"] 'Apple' >>> fruits_dict["2"] 'Banana' >>> fruits_dict[3] 'Orange' >>> fruits_dict[None] 'NA'4
đầu ra
>>> fruits_dict["1"] 'Apple' >>> fruits_dict["2"] 'Banana' >>> fruits_dict[3] 'Orange' >>> fruits_dict[None] 'NA'5
3. pop[key[,default]]
Phương thức này xóa khóa đã chỉ định khỏi từ điển và trả về giá trị tương ứng. Nếu không tìm thấy khóa, giá trị mặc định tùy chọn được trả về. Nếu không tìm thấy khóa và giá trị mặc định không được cung cấp, KeyError sẽ được nâng lên
>>> fruits_dict["1"] 'Apple' >>> fruits_dict["2"] 'Banana' >>> fruits_dict[3] 'Orange' >>> fruits_dict[None] 'NA'6
Chúng tôi đang sử dụng khối thử ngoại trừ để bắt lỗi KeyError và in thông báo lỗi
4. sao chép[]
Hàm này trả về một bản sao nông của từ điển. Nếu đối tượng bên dưới có thể thay đổi và thay đổi, thì thay đổi đó cũng sẽ phản ánh trong lệnh được trả về bằng phương thức copy[]
>>> fruits_dict["1"] 'Apple' >>> fruits_dict["2"] 'Banana' >>> fruits_dict[3] 'Orange' >>> fruits_dict[None] 'NA'7
đầu ra
>>> fruits_dict["1"] 'Apple' >>> fruits_dict["2"] 'Banana' >>> fruits_dict[3] 'Orange' >>> fruits_dict[None] 'NA'8
5. xa lạ[]
Phương pháp này loại bỏ tất cả các mục từ từ điển. Nó tương tự như việc gán biến cho một từ điển trống
>>> fruits_dict["1"] 'Apple' >>> fruits_dict["2"] 'Banana' >>> fruits_dict[3] 'Orange' >>> fruits_dict[None] 'NA'9
6. fromKeys[có thể lặp lại, giá trị]
Phương thức tĩnh này tạo một từ điển mới với các khóa từ có thể lặp lại và các giá trị được đặt thành giá trị được cung cấp. Nếu giá trị không được cung cấp, các giá trị được đặt thành Không có
my_dict.nested_value.n1
20đầu ra
my_dict.nested_value.n1
217. nhận [khóa [, mặc định]]
Phương thức này trả về giá trị cho khóa. Nếu không tìm thấy khóa, giá trị mặc định tùy chọn được trả về. Nếu không tìm thấy khóa và giá trị mặc định không được cung cấp, thì trả về Không có
my_dict.nested_value.n1
228. phím[]
Hàm này trả về danh sách các khóa trong đối tượng dict_keys. Chúng tôi có thể lặp lại danh sách này để xử lý các giá trị từ điển
my_dict.nested_value.n1
23đầu ra
my_dict.nested_value.n1
249. popitem[]
Phương thức này loại bỏ và trả về một số mục từ điển dưới dạng bộ khóa-giá trị. Nếu từ điển trống, KeyError được nâng lên. Chúng ta có thể sử dụng chức năng này với vòng lặp while để xử lý các mục từ điển theo thứ tự ngẫu nhiên
my_dict.nested_value.n1
25đầu ra
my_dict.nested_value.n1
2610. setdefault[key[,default]]
Phương pháp này được sử dụng để thêm một khóa vào từ điển khi và chỉ khi nó không có trong từ điển. Phương thức này đặt giá trị khóa thành giá trị mặc định được cung cấp, nếu không thì Không
Phương thức trả về giá trị cho khóa nếu nó có trong từ điển, nếu không thì trả về giá trị mặc định
my_dict.nested_value.n1
27đầu ra
my_dict.nested_value.n1
2811. cập nhật [dict]
Phương pháp này được sử dụng để cập nhật các mục từ điển từ từ điển đã cho. Nếu không tìm thấy khóa từ điển đã cho, nó sẽ được thêm vào từ điển. Nếu khóa được tìm thấy, giá trị sẽ được cập nhật
my_dict.nested_value.n1
29đầu ra.
>>> my_dict = {1:"1", 2:"2"} >>> del my_dict[1] >>> print[my_dict] {2: '2'} >>> del my_dict >>> print[my_dict] Traceback [most recent call last]: File "", line 1, in NameError: name 'my_dict' is not defined >>>4
Bản tóm tắt
Từ điển là một bộ sưu tập giống như bản đồ để lưu trữ các cặp khóa-giá trị. Các mục trong từ điển được truy cập thông qua chỉ mục dựa trên khóa. Chúng tôi có thể cập nhật, thêm và xóa các mục từ điển. Có nhiều cách khác nhau để sử dụng vòng lặp for để lặp qua các khóa, giá trị hoặc mục từ điển