Có phải tất cả các từ điển đối tượng python không?

Tìm hiểu cách cấu trúc dữ liệu từ điển của Python hoạt động như một cách mạnh mẽ và linh hoạt để lưu trữ và truy xuất các đối tượng và dữ liệu trong ứng dụng của bạn

Có phải tất cả các từ điển đối tượng python không?
Bởi Serdar Yegulalp

Nhà văn cao cấp, InfoWorld.

Python programmingMaria Vonotna/Shutterstock

Mục lục

Cho xem nhiều hơn

Tất cả các ngôn ngữ lập trình đều có nhiều cấu trúc dữ liệu khác nhau, mỗi cấu trúc phù hợp với các loại công việc cụ thể. Trong số các cấu trúc dữ liệu được tích hợp trong Python, nổi bật là từ điển hoặc Python

example_values = {
    "integer": 32,
    "float": 5.5,
    "string": "hello world",
    "variable": some_var,
    "object": some_obj,
    "function_output": some_func(),
    "some_list": [1,2,3],
    "another_dict": {
        "Blade Runner": 1982
    }
}
7. Từ điển Python là một cách nhanh chóng, linh hoạt để lưu trữ và truy xuất dữ liệu theo tên hoặc thậm chí là một loại đối tượng phức tạp hơn, thay vì chỉ một số chỉ mục

Từ điển Python bao gồm một hoặc nhiều khóa—một đối tượng như chuỗi hoặc số nguyên. Mỗi khóa được liên kết với một giá trị, có thể là bất kỳ đối tượng Python nào. Bạn sử dụng một khóa để lấy các giá trị liên quan của nó và thời gian tra cứu cho mỗi cặp khóa/giá trị rất không đổi. Trong các ngôn ngữ khác, loại cấu trúc dữ liệu này đôi khi được gọi là bản đồ băm hoặc mảng kết hợp

Trong bài viết này, chúng ta sẽ tìm hiểu những kiến ​​thức cơ bản về từ điển Python, bao gồm cách sử dụng chúng, các tình huống mà chúng có ý nghĩa cũng như một số vấn đề và cạm bẫy phổ biến cần lưu ý.

[ Cũng trên InfoWorld. 4 chìa khóa để viết Python hiện đại vào năm 2022 ]

Làm việc với từ điển Python

Hãy bắt đầu với một ví dụ đơn giản về từ điển Python

movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}

Trong từ điển này, tên phim là chìa khóa và năm phát hành là giá trị. Cấu trúc

example_values = {
    "integer": 32,
    "float": 5.5,
    "string": "hello world",
    "variable": some_var,
    "object": some_obj,
    "function_output": some_func(),
    "some_list": [1,2,3],
    "another_dict": {
        "Blade Runner": 1982
    }
}
8 có thể được lặp đi lặp lại vô thời hạn

Ví dụ mà chúng ta thấy ở đây được gọi là từ điển theo nghĩa đen—một cấu trúc từ điển được mã hóa cứng vào mã nguồn của chương trình. Bạn cũng có thể tạo hoặc sửa đổi từ điển theo chương trình, như bạn sẽ thấy ở phần sau

Các phím trong từ điển

Khóa từ điển Python có thể gần như bất kỳ đối tượng Python nào. Tôi nói "gần như" bởi vì đối tượng được đề cập phải có thể băm được, nghĩa là nó phải có giá trị băm (đầu ra của phương thức

example_values = {
    "integer": 32,
    "float": 5.5,
    "string": "hello world",
    "variable": some_var,
    "object": some_obj,
    "function_output": some_func(),
    "some_list": [1,2,3],
    "another_dict": {
        "Blade Runner": 1982
    }
}
9 của nó) không thay đổi trong suốt thời gian tồn tại của nó và có thể được so sánh với các đối tượng khác

Bất kỳ đối tượng Python có thể thay đổi nào đều không có giá trị băm nhất quán trong suốt thời gian tồn tại của nó và do đó không thể được sử dụng làm khóa. Chẳng hạn, một danh sách không thể là một khóa, bởi vì các phần tử có thể được thêm vào hoặc xóa khỏi danh sách. Tương tự như vậy, bản thân từ điển không thể là chìa khóa vì lý do tương tự. Nhưng một bộ dữ liệu có thể là một khóa, bởi vì một bộ dữ liệu là bất biến và do đó có hàm băm nhất quán trong suốt thời gian tồn tại của nó

Các chuỗi, số (số nguyên và số float giống nhau), bộ dữ liệu và các đối tượng đơn lẻ tích hợp sẵn (

new_dict = {}
0,
new_dict = {}
1 và
new_dict = {}
2) đều là những loại phổ biến được sử dụng làm khóa

Một khóa nhất định là duy nhất cho một từ điển nhất định. Không thể sử dụng bội số của cùng một khóa. Nếu bạn muốn có một khóa trỏ đến nhiều giá trị, thì bạn nên sử dụng cấu trúc như danh sách, bộ hoặc thậm chí một từ điển khác làm giá trị. (Thông tin thêm về điều này trong thời gian ngắn. )

Giá trị trong từ điển

Các giá trị trong từ điển có thể là bất kỳ đối tượng Python nào. Dưới đây là một số ví dụ về các giá trị

example_values = {
    "integer": 32,
    "float": 5.5,
    "string": "hello world",
    "variable": some_var,
    "object": some_obj,
    "function_output": some_func(),
    "some_list": [1,2,3],
    "another_dict": {
        "Blade Runner": 1982
    }
}

Một lần nữa, để lưu trữ nhiều giá trị trong một khóa, chỉ cần sử dụng loại vùng chứa—danh sách, từ điển hoặc bộ—làm giá trị. Trong ví dụ trên, các phím

new_dict = {}
3 và
new_dict = {}
4 giữ các danh sách và từ điển tương ứng. Bằng cách này, bạn có thể tạo các cấu trúc lồng nhau ở bất kỳ độ sâu nào cần thiết

Tạo từ điển mới

Bạn có thể tạo một từ điển trống mới bằng cách khai báo đơn giản

new_dict = {}

Bạn cũng có thể sử dụng

new_dict = {}
5 tích hợp sẵn để tạo một từ điển mới từ một chuỗi các cặp

movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
2

Một cách khác để xây dựng từ điển là hiểu từ điển, trong đó bạn chỉ định các khóa và giá trị từ một chuỗi

movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
3

Nhận và đặt các khóa và giá trị từ điển

Để truy xuất một giá trị từ từ điển, bạn sử dụng cú pháp lập chỉ mục của Python

movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
4

Nếu bạn có một vùng chứa dưới dạng giá trị và bạn muốn truy xuất một giá trị lồng nhau—tức là giá trị nào đó từ bên trong vùng chứa—bạn có thể truy cập trực tiếp vào vùng chứa đó bằng cách lập chỉ mục (nếu được hỗ trợ) hoặc bằng cách sử dụng chỉ định quảng cáo xen kẽ

movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
5

Đặt giá trị trong từ điển đủ đơn giản

movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
6

sử dụng. get() để truy xuất các giá trị từ điển một cách an toàn

Nếu bạn cố truy xuất một giá trị bằng một khóa không tồn tại trong một từ điển nhất định, bạn sẽ đưa ra một ngoại lệ

new_dict = {}
6. Một cách phổ biến để xử lý loại truy xuất này là sử dụng khối
new_dict = {}
7. Một cách thanh lịch hơn để tìm khóa có thể không có ở đó là phương pháp
new_dict = {}
8

Phương thức

new_dict = {}
8 trên từ điển cố gắng tìm một giá trị được liên kết với một khóa đã cho. Nếu không có giá trị như vậy tồn tại, nó sẽ trả về
new_dict = {}
2 hoặc giá trị mặc định mà bạn chỉ định. Trong một số trường hợp, bạn sẽ muốn đưa ra lỗi một cách rõ ràng, nhưng phần lớn thời gian bạn sẽ chỉ muốn cung cấp một giá trị mặc định lành mạnh.

example_values = {
    "integer": 32,
    "float": 5.5,
    "string": "hello world",
    "variable": some_var,
    "object": some_obj,
    "function_output": some_func(),
    "some_list": [1,2,3],
    "another_dict": {
        "Blade Runner": 1982
    }
}
2

Khi nào nên sử dụng từ điển Python

Sử dụng từ điển Python có ý nghĩa nhất trong các điều kiện sau

  • Bạn muốn lưu trữ các đối tượng và dữ liệu bằng tên, không chỉ vị trí hoặc số chỉ mục. Nếu bạn muốn lưu trữ các phần tử để có thể truy xuất chúng theo số chỉ mục của chúng, hãy sử dụng danh sách. Lưu ý rằng bạn có thể sử dụng số nguyên làm khóa chỉ mục, nhưng điều này không hoàn toàn giống với việc lưu trữ dữ liệu trong cấu trúc danh sách, được tối ưu hóa cho các hành động như thêm vào cuối danh sách. (Các từ điển, như bạn sẽ thấy, không có phần tử "kết thúc" hoặc "bắt đầu" như vậy. )
  • Bạn cần tìm nhanh dữ liệu, đối tượng theo tên. Từ điển được tối ưu hóa để việc tra cứu các khóa hầu như luôn diễn ra trong thời gian cố định, bất kể kích thước từ điển là bao nhiêu. Bạn cũng có thể tìm thấy một phần tử trong danh sách theo vị trí của nó trong thời gian không đổi, nhưng bạn không thể tìm kiếm một phần tử cụ thể một cách nhanh chóng—bạn phải lặp lại danh sách để tìm một thứ cụ thể nếu bạn không biết vị trí của nó
  • Thứ tự của các yếu tố không quan trọng bằng sự hiện diện của chúng. Một lần nữa, nếu thứ tự của các phần tử quan trọng hơn việc một phần tử nhất định có tồn tại trong bộ sưu tập hay không, hãy sử dụng danh sách. Ngoài ra, như bạn sẽ lưu ý bên dưới, trong khi các từ điển giữ nguyên thứ tự mà các phần tử này được chèn vào, thì điều đó không giống với việc có thể nhanh chóng chuyển sang phần tử thứ n

Gotchas cho các giá trị trong từ điển

Có một vài đặc điểm đáng lưu ý về cách các giá trị hoạt động trong từ điển

Đầu tiên, nếu bạn sử dụng tên biến làm giá trị, thì những gì được lưu trữ dưới khóa đó là giá trị chứa trong biến tại thời điểm giá trị từ điển được xác định. Đây là một ví dụ

example_values = {
    "integer": 32,
    "float": 5.5,
    "string": "hello world",
    "variable": some_var,
    "object": some_obj,
    "function_output": some_func(),
    "some_list": [1,2,3],
    "another_dict": {
        "Blade Runner": 1982
    }
}
4

Trong trường hợp này, chúng tôi đặt

movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
22 thành số nguyên
movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
23 trước khi xác định từ điển. Khóa
movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
24 sẽ chứa giá trị
movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
23. Nhưng nếu chúng ta thay đổi
movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
22 sau khi từ điển được xác định, thì nội dung của khóa
movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
24 sẽ không thay đổi. (Quy tắc này cũng áp dụng cho danh sách Python và các loại vùng chứa khác trong Python. )

Một quy tắc tương tự áp dụng cho cách các đầu ra của hàm hoạt động như các giá trị từ điển. Đối với khóa

movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
28, chúng tôi có
movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
29. Điều này có nghĩa là khi từ điển được xác định,
movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
29 được thực thi và giá trị trả về được sử dụng làm giá trị cho
movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
28. Nhưng
movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
29 không được thực hiện lại mỗi khi chúng tôi truy cập khóa
movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
28. Giá trị đó sẽ vẫn như khi nó được tạo lần đầu tiên

Nếu muốn chạy lại

movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
29 mỗi khi truy cập khóa đó, chúng ta cần thực hiện một cách tiếp cận khác—một cách tiếp cận cũng có những cách sử dụng khác

Gọi các đối tượng hàm trong từ điển

Các đối tượng chức năng có thể được lưu trữ trong từ điển dưới dạng giá trị. Điều này cho phép chúng tôi sử dụng từ điển để thực thi một trong các lựa chọn chức năng dựa trên một số phím—một cách phổ biến để mô phỏng chức năng

movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
35 được tìm thấy trong các ngôn ngữ khác

Đầu tiên, chúng tôi lưu trữ đối tượng chức năng trong từ điển, sau đó chúng tôi truy xuất và thực thi nó

example_values = {
    "integer": 32,
    "float": 5.5,
    "string": "hello world",
    "variable": some_var,
    "object": some_obj,
    "function_output": some_func(),
    "some_list": [1,2,3],
    "another_dict": {
        "Blade Runner": 1982
    }
}
0

Lưu ý rằng chúng ta cần xác định các chức năng trước, sau đó liệt kê chúng trong từ điển

Ngoài ra, Python kể từ phiên bản 3. 10 có một tính năng gọi là khớp mẫu cấu trúc giống như các câu lệnh

movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
35 thông thường. Nhưng trong Python, nó được dùng để khớp với các cấu trúc hoặc tổ hợp các loại, không chỉ các giá trị đơn lẻ. Nếu bạn muốn sử dụng một giá trị để thực hiện một hành động hoặc chỉ trả về một giá trị khác, hãy sử dụng từ điển

[ Cũng trên InfoWorld. Nhận video giới thiệu về khớp mẫu cấu trúc ]

Lặp lại thông qua từ điển

Nếu bạn cần lặp lại một từ điển để kiểm tra tất cả các khóa hoặc giá trị của nó, có một số cách khác nhau để thực hiện. Phổ biến nhất là sử dụng vòng lặp

movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
37 trên từ điển—e. g. ,
movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
38. Điều này mang lại các khóa trong từ điển, sau đó có thể được sử dụng để truy xuất các giá trị nếu cần

example_values = {
    "integer": 32,
    "float": 5.5,
    "string": "hello world",
    "variable": some_var,
    "object": some_obj,
    "function_output": some_func(),
    "some_list": [1,2,3],
    "another_dict": {
        "Blade Runner": 1982
    }
}
1

Cuộc gọi này sẽ mang lại

movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
39, sau đó là
movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
40

Thay vào đó, nếu chúng ta sử dụng như sau

example_values = {
    "integer": 32,
    "float": 5.5,
    "string": "hello world",
    "variable": some_var,
    "object": some_obj,
    "function_output": some_func(),
    "some_list": [1,2,3],
    "another_dict": {
        "Blade Runner": 1982
    }
}
2

chúng tôi sẽ nhận được

movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
41 và
movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
42. Trong trường hợp này, chúng tôi đang sử dụng các khóa để lấy các giá trị

Nếu chúng ta chỉ muốn các giá trị, chúng ta có thể lặp lại bằng phương thức

movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
43 có sẵn trên từ điển

example_values = {
    "integer": 32,
    "float": 5.5,
    "string": "hello world",
    "variable": some_var,
    "object": some_obj,
    "function_output": some_func(),
    "some_list": [1,2,3],
    "another_dict": {
        "Blade Runner": 1982
    }
}
3

Cuối cùng, chúng ta có thể lấy cả khóa và giá trị cùng nhau bằng phương thức

movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
44

example_values = {
    "integer": 32,
    "float": 5.5,
    "string": "hello world",
    "variable": some_var,
    "object": some_obj,
    "function_output": some_func(),
    "some_list": [1,2,3],
    "another_dict": {
        "Blade Runner": 1982
    }
}
4

Đặt hàng trong từ điển Python

Một điều bạn có thể nhận thấy khi lặp qua từ điển là các khóa thường được trả về theo thứ tự mà chúng được chèn vào

Điều này không phải lúc nào cũng đúng. Trước Python 3. 6, các mục trong từ điển sẽ không được trả về theo bất kỳ thứ tự cụ thể nào nếu bạn lặp qua chúng. Phiên bản 3. 6 đã giới thiệu một thuật toán từ điển mới và hiệu quả hơn, thuật toán này giữ lại thứ tự chèn cho các khóa như một tác dụng phụ thuận tiện

Trước đây, Python đã cung cấp loại này như một cách để xây dựng từ điển giữ nguyên thứ tự chèn.

movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
45 vẫn có sẵn trong thư viện tiêu chuẩn, chủ yếu là do nhiều phần mềm hiện có sử dụng nó và cũng bởi vì nó hỗ trợ các phương thức vẫn chưa có sẵn với các ký tự thông thường. Chẳng hạn, nó cung cấp
movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
46 để trả về các khóa từ điển theo thứ tự chèn ngược lại, điều mà các từ điển thông thường không làm được

Xóa các mục khỏi từ điển

Đôi khi bạn cần xóa hoàn toàn một cặp khóa/giá trị khỏi từ điển. Đối với điều này, hãy sử dụng

movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
47 tích hợp sẵn

example_values = {
    "integer": 32,
    "float": 5.5,
    "string": "hello world",
    "variable": some_var,
    "object": some_obj,
    "function_output": some_func(),
    "some_list": [1,2,3],
    "another_dict": {
        "Blade Runner": 1982
    }
}
5

Điều này loại bỏ cặp khóa/giá trị

movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
48 khỏi ví dụ của chúng tôi ở đầu bài viết

Lưu ý rằng việc đặt khóa hoặc giá trị thành

new_dict = {}
2 không giống như xóa các phần tử đó khỏi từ điển. Chẳng hạn, lệnh
movie_years = {
    "2001: a space odyssey": 1968,
    "Blade Runner": 1982
}
50 sẽ chỉ đặt giá trị của khóa đó thành
new_dict = {}
2;

Tìm khóa theo giá trị

Một câu hỏi phổ biến với từ điển là liệu có thể tìm thấy khóa bằng cách tra cứu giá trị hay không. Câu trả lời ngắn gọn là không—ít nhất, không phải không lặp qua các cặp khóa/giá trị để tìm đúng giá trị (và do đó, khóa phù hợp đi cùng với nó)

Nếu bạn thấy mình ở trong tình huống cần tìm khóa theo giá trị của chúng, cũng như giá trị theo cách của khóa, hãy cân nhắc giữ hai từ điển, trong đó một trong số chúng có khóa và giá trị đảo ngược. Tuy nhiên, bạn không thể làm điều này nếu các giá trị bạn đang lưu trữ không thể băm được. Trong trường hợp như vậy, bạn sẽ phải dùng đến việc lặp lại từ điển—hoặc tốt hơn hết là tìm một giải pháp nhẹ nhàng hơn cho vấn đề mà bạn đang thực sự cố gắng giải quyết

Từ điển vs. bộ

Cuối cùng, Python có một cấu trúc dữ liệu khác, tập hợp, bề ngoài giống như một từ điển. Hãy nghĩ về nó như một từ điển chỉ có các khóa, nhưng không có giá trị. Cú pháp của nó cũng tương tự như từ điển

example_values = {
    "integer": 32,
    "float": 5.5,
    "string": "hello world",
    "variable": some_var,
    "object": some_obj,
    "function_output": some_func(),
    "some_list": [1,2,3],
    "another_dict": {
        "Blade Runner": 1982
    }
}
6

Tuy nhiên, các bộ không phải để lưu trữ thông tin được liên kết với một khóa nhất định. Chúng được sử dụng chủ yếu để lưu trữ các giá trị có thể băm theo cách có thể nhanh chóng kiểm tra sự hiện diện hay vắng mặt của chúng. Ngoài ra, các bộ không duy trì thứ tự chèn vì mã mà chúng sử dụng không giống với mã được sử dụng để tạo từ điển

Có liên quan

  • con trăn
  • Ngôn ngữ lập trình
  • Phát triển phần mềm

Serdar Yegulalp là một nhà văn cao cấp tại InfoWorld, tập trung vào học máy, container hóa, devops, hệ sinh thái Python và đánh giá định kỳ

Đối tượng Python có phải là từ điển không?

Cuối cùng, hầu hết các đối tượng trong Python thực ra chỉ là từ điển .

Các từ điển Python có giống như các đối tượng không?

Đối tượng và từ điển là tương tự nhau; . Trong JavaScript, từ điển được gọi là đối tượng, trong khi trong các ngôn ngữ như Python hoặc C#, chúng được gọi là từ điển .

Giá trị từ điển Python có thể là đối tượng không?

Khóa từ điển phải là đối tượng bất biến. Giá trị từ điển có thể là bất kỳ đối tượng nào .

Các đối tượng có thể là khóa từ điển Python không?

Hầu hết mọi loại giá trị đều có thể được sử dụng làm khóa từ điển trong Python. Bạn thậm chí có thể sử dụng các đối tượng tích hợp sẵn như kiểu và hàm .