Cấu trúc dữ liệu trong Python có dễ không?

Cấu trúc dữ liệu là cấu trúc cơ bản xung quanh đó bạn xây dựng chương trình của mình. Mỗi cấu trúc dữ liệu cung cấp một cách tổ chức dữ liệu cụ thể để có thể truy cập dữ liệu một cách hiệu quả, tùy thuộc vào trường hợp sử dụng của bạn. Python cung cấp một bộ cấu trúc dữ liệu phong phú trong thư viện tiêu chuẩn của nó

Tuy nhiên, quy ước đặt tên của Python không cung cấp mức độ rõ ràng như bạn sẽ tìm thấy trong các ngôn ngữ khác. Trong Java, một danh sách không chỉ là một

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
6—nó có thể là một
>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
7 hoặc một
>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
8. Không phải như vậy trong Python. Ngay cả những nhà phát triển Python có kinh nghiệm đôi khi cũng thắc mắc liệu loại ____________6 tích hợp được triển khai dưới dạng danh sách được liên kết hay một mảng động

Trong hướng dẫn này, bạn sẽ học

  • Những kiểu dữ liệu trừu tượng phổ biến nào được tích hợp sẵn trong thư viện chuẩn Python
  • Cách các loại dữ liệu trừu tượng phổ biến nhất ánh xạ tới sơ đồ đặt tên của Python
  • Cách đưa các kiểu dữ liệu trừu tượng vào sử dụng thực tế trong các thuật toán khác nhau

Ghi chú. Hướng dẫn này được chuyển thể từ chương “Cấu trúc dữ liệu chung trong Python” trong Thủ thuật Python. Quyển sách. Nếu bạn thích những gì bạn đọc dưới đây, thì hãy nhớ xem phần còn lại của cuốn sách

Tải xuống miễn phí. Nhận một chương mẫu từ Thủ thuật Python. Cuốn sách chỉ cho bạn các phương pháp hay nhất về Python với các ví dụ đơn giản mà bạn có thể áp dụng ngay lập tức để viết mã Pythonic + đẹp hơn

Từ điển, Bản đồ và Bảng băm

Trong Python, từ điển [hay gọi tắt là dicts] là một cấu trúc dữ liệu trung tâm. Dicts lưu trữ một số đối tượng tùy ý, mỗi đối tượng được xác định bằng một khóa từ điển duy nhất

Từ điển cũng thường được gọi là bản đồ, hashmap, bảng tra cứu hoặc mảng kết hợp. Chúng cho phép tra cứu, chèn và xóa hiệu quả bất kỳ đối tượng nào được liên kết với một khóa đã cho

Danh bạ điện thoại tạo ra một đối tượng tương tự trong thế giới thực phù hợp cho các đối tượng từ điển. Chúng cho phép bạn nhanh chóng truy xuất thông tin [số điện thoại] được liên kết với một khóa nhất định [tên của một người]. Thay vì phải đọc danh bạ điện thoại từ trước ra sau để tìm số của ai đó, bạn có thể chuyển trực tiếp đến một tên và tra cứu thông tin liên quan

Sự tương tự này bị phá vỡ phần nào khi nói đến cách thông tin được tổ chức để cho phép tra cứu nhanh. Nhưng các đặc điểm hiệu suất cơ bản giữ. Từ điển cho phép bạn nhanh chóng tìm thấy thông tin được liên kết với một khóa nhất định

Từ điển là một trong những cấu trúc dữ liệu quan trọng và được sử dụng thường xuyên nhất trong khoa học máy tính. Vậy Python xử lý từ điển như thế nào?

Loại bỏ các quảng cáo

>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
0. Từ điển Go-To của bạn

Vì từ điển rất quan trọng nên Python có tính năng triển khai từ điển mạnh mẽ được tích hợp trực tiếp vào ngôn ngữ cốt lõi. kiểu dữ liệu

Python cũng cung cấp một số đường cú pháp hữu ích để làm việc với từ điển trong chương trình của bạn. Ví dụ: cú pháp biểu thức từ điển dấu ngoặc nhọn [{ }] và cho phép bạn xác định các đối tượng từ điển mới một cách thuận tiện

>>>

>>> phonebook = {
..     "bob": 7387,
..     "alice": 3719,
..     "jack": 7052,
.. }

>>> squares = {x: x * x for x in range[6]}

>>> phonebook["alice"]
3719

>>> squares
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

Có một số hạn chế về đối tượng nào có thể được sử dụng làm khóa hợp lệ

Từ điển của Python được lập chỉ mục bởi các khóa có thể thuộc bất kỳ loại nào. Đối tượng có thể băm có giá trị băm không bao giờ thay đổi trong suốt thời gian tồn tại của nó [xem

>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
2] và nó có thể được so sánh với các đối tượng khác [xem
>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
3]. Các đối tượng có thể băm được so sánh bằng nhau phải có cùng giá trị băm

Các loại bất biến như chuỗi và số có thể băm được và hoạt động tốt như các khóa từ điển. Bạn cũng có thể sử dụng làm khóa từ điển miễn là chúng chỉ chứa các loại có thể băm

Đối với hầu hết các trường hợp sử dụng, việc triển khai từ điển tích hợp sẵn của Python sẽ làm mọi thứ bạn cần. Từ điển được tối ưu hóa cao và làm nền tảng cho nhiều phần của ngôn ngữ. Ví dụ: và các biến trong a đều được lưu trữ nội bộ trong từ điển

Từ điển Python dựa trên triển khai bảng băm đã được kiểm tra kỹ lưỡng và tinh chỉnh, cung cấp các đặc tính hiệu suất mà bạn mong đợi. Độ phức tạp thời gian O[1] đối với các thao tác tra cứu, chèn, cập nhật và xóa trong trường hợp trung bình

Có rất ít lý do để không sử dụng triển khai

>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
0 tiêu chuẩn đi kèm với Python. Tuy nhiên, vẫn tồn tại các triển khai từ điển chuyên biệt của bên thứ ba, chẳng hạn như danh sách bỏ qua hoặc từ điển dựa trên cây B

Bên cạnh các đối tượng

>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
0 đơn giản, thư viện chuẩn của Python cũng bao gồm một số triển khai từ điển chuyên ngành. Các từ điển chuyên ngành này đều dựa trên lớp từ điển tích hợp sẵn [và chia sẻ các đặc điểm hoạt động của nó] nhưng cũng bao gồm một số tính năng tiện lợi bổ sung

Hãy cùng xem qua chúng

>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
7. Ghi nhớ thứ tự chèn phím

Python bao gồm một lớp con

>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
0 chuyên biệt ghi nhớ thứ tự chèn của các khóa được thêm vào nó.
>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
7

Ghi chú.

>>> arr = ["one", "two", "three"]
>>> arr[0]
'one'

>>> # Lists have a nice repr:
>>> arr
['one', 'two', 'three']

>>> # Lists are mutable:
>>> arr[1] = "hello"
>>> arr
['one', 'hello', 'three']

>>> del arr[1]
>>> arr
['one', 'three']

>>> # Lists can hold arbitrary data types:
>>> arr.append[23]
>>> arr
['one', 'three', 23]
0 không phải là một phần tích hợp sẵn của ngôn ngữ chính và phải được nhập từ mô-đun
>>> arr = ["one", "two", "three"]
>>> arr[0]
'one'

>>> # Lists have a nice repr:
>>> arr
['one', 'two', 'three']

>>> # Lists are mutable:
>>> arr[1] = "hello"
>>> arr
['one', 'hello', 'three']

>>> del arr[1]
>>> arr
['one', 'three']

>>> # Lists can hold arbitrary data types:
>>> arr.append[23]
>>> arr
['one', 'three', 23]
1 trong thư viện tiêu chuẩn

Trong khi các phiên bản

>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
0 tiêu chuẩn duy trì thứ tự chèn của các khóa trong Python 3. 6 trở lên, đây chỉ đơn giản là tác dụng phụ của việc triển khai CPython và không được xác định trong thông số ngôn ngữ cho đến Python 3. 7. Vì vậy, nếu thứ tự khóa là quan trọng để thuật toán của bạn hoạt động, thì tốt nhất bạn nên truyền đạt điều này một cách rõ ràng bằng cách sử dụng rõ ràng lớp
>>> arr = ["one", "two", "three"]
>>> arr[0]
'one'

>>> # Lists have a nice repr:
>>> arr
['one', 'two', 'three']

>>> # Lists are mutable:
>>> arr[1] = "hello"
>>> arr
['one', 'hello', 'three']

>>> del arr[1]
>>> arr
['one', 'three']

>>> # Lists can hold arbitrary data types:
>>> arr.append[23]
>>> arr
['one', 'three', 23]
0

>>>

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]

Cho đến Python 3. 8, bạn không thể lặp lại các mục từ điển theo thứ tự ngược lại bằng cách sử dụng

>>> arr = ["one", "two", "three"]
>>> arr[0]
'one'

>>> # Lists have a nice repr:
>>> arr
['one', 'two', 'three']

>>> # Lists are mutable:
>>> arr[1] = "hello"
>>> arr
['one', 'hello', 'three']

>>> del arr[1]
>>> arr
['one', 'three']

>>> # Lists can hold arbitrary data types:
>>> arr.append[23]
>>> arr
['one', 'three', 23]
4. Chỉ có
>>> arr = ["one", "two", "three"]
>>> arr[0]
'one'

>>> # Lists have a nice repr:
>>> arr
['one', 'two', 'three']

>>> # Lists are mutable:
>>> arr[1] = "hello"
>>> arr
['one', 'hello', 'three']

>>> del arr[1]
>>> arr
['one', 'three']

>>> # Lists can hold arbitrary data types:
>>> arr.append[23]
>>> arr
['one', 'three', 23]
0 phiên bản cung cấp chức năng đó. Ngay cả trong Python 3. 8,
>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
0 và
>>> arr = ["one", "two", "three"]
>>> arr[0]
'one'

>>> # Lists have a nice repr:
>>> arr
['one', 'two', 'three']

>>> # Lists are mutable:
>>> arr[1] = "hello"
>>> arr
['one', 'hello', 'three']

>>> del arr[1]
>>> arr
['one', 'three']

>>> # Lists can hold arbitrary data types:
>>> arr.append[23]
>>> arr
['one', 'three', 23]
0 đối tượng không hoàn toàn giống nhau. Phiên bản
>>> arr = ["one", "two", "three"]
>>> arr[0]
'one'

>>> # Lists have a nice repr:
>>> arr
['one', 'two', 'three']

>>> # Lists are mutable:
>>> arr[1] = "hello"
>>> arr
['one', 'hello', 'three']

>>> del arr[1]
>>> arr
['one', 'three']

>>> # Lists can hold arbitrary data types:
>>> arr.append[23]
>>> arr
['one', 'three', 23]
0 có phương thức
>>> arr = ["one", "two", "three"]
>>> arr[0]
'one'

>>> # Lists have a nice repr:
>>> arr
['one', 'two', 'three']

>>> # Lists are mutable:
>>> arr[1] = "hello"
>>> arr
['one', 'hello', 'three']

>>> del arr[1]
>>> arr
['one', 'three']

>>> # Lists can hold arbitrary data types:
>>> arr.append[23]
>>> arr
['one', 'three', 23]
9 không khả dụng trên phiên bản
>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
0 đơn giản, cũng như có thể tùy chỉnh nhiều hơn so với phiên bản
>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
0 đơn giản

>>> arr = ["one", "two", "three"]
>>> arr[0]
'one'

>>> # Tuples have a nice repr:
>>> arr
['one', 'two', 'three']

>>> # Tuples are immutable:
>>> arr[1] = "hello"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'tuple' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'tuple' object doesn't support item deletion

>>> # Tuples can hold arbitrary data types:
>>> # [Adding elements creates a copy of the tuple]
>>> arr + [23,]
['one', 'two', 'three', 23]
3. Trả lại giá trị mặc định cho các phím bị thiếu

Lớp này là một lớp con từ điển khác chấp nhận một hàm có thể gọi được trong hàm tạo của nó có giá trị trả về sẽ được sử dụng nếu không tìm thấy khóa được yêu cầu

Điều này có thể giúp bạn tiết kiệm một số thao tác nhập và làm cho ý định của bạn rõ ràng hơn so với việc sử dụng

>>> arr = ["one", "two", "three"]
>>> arr[0]
'one'

>>> # Tuples have a nice repr:
>>> arr
['one', 'two', 'three']

>>> # Tuples are immutable:
>>> arr[1] = "hello"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'tuple' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'tuple' object doesn't support item deletion

>>> # Tuples can hold arbitrary data types:
>>> # [Adding elements creates a copy of the tuple]
>>> arr + [23,]
['one', 'two', 'three', 23]
5 hoặc bắt một ngoại lệ
>>> arr = ["one", "two", "three"]
>>> arr[0]
'one'

>>> # Tuples have a nice repr:
>>> arr
['one', 'two', 'three']

>>> # Tuples are immutable:
>>> arr[1] = "hello"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'tuple' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'tuple' object doesn't support item deletion

>>> # Tuples can hold arbitrary data types:
>>> # [Adding elements creates a copy of the tuple]
>>> arr + [23,]
['one', 'two', 'three', 23]
6 trong các từ điển thông thường

>>>

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']

Loại bỏ các quảng cáo

>>> arr = ["one", "two", "three"]
>>> arr[0]
'one'

>>> # Tuples have a nice repr:
>>> arr
['one', 'two', 'three']

>>> # Tuples are immutable:
>>> arr[1] = "hello"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'tuple' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'tuple' object doesn't support item deletion

>>> # Tuples can hold arbitrary data types:
>>> # [Adding elements creates a copy of the tuple]
>>> arr + [23,]
['one', 'two', 'three', 23]
7. Tìm kiếm nhiều từ điển dưới dạng ánh xạ đơn

Cấu trúc dữ liệu nhóm nhiều từ điển thành một ánh xạ duy nhất. Tra cứu tìm kiếm từng ánh xạ cơ bản cho đến khi tìm thấy khóa. Chèn, cập nhật và xóa chỉ ảnh hưởng đến ánh xạ đầu tiên được thêm vào chuỗi

>>>

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'

>>> arr = ["one", "two", "three"]
>>> arr[0]
'one'

>>> # Tuples have a nice repr:
>>> arr
['one', 'two', 'three']

>>> # Tuples are immutable:
>>> arr[1] = "hello"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'tuple' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'tuple' object doesn't support item deletion

>>> # Tuples can hold arbitrary data types:
>>> # [Adding elements creates a copy of the tuple]
>>> arr + [23,]
['one', 'two', 'three', 23]
9. Trình bao bọc để tạo từ điển chỉ đọc

là trình bao bọc xung quanh từ điển tiêu chuẩn cung cấp chế độ xem chỉ đọc đối với dữ liệu của từ điển được bao bọc. Lớp này đã được thêm vào Python 3. 3 và có thể được sử dụng để tạo các phiên bản proxy bất biến của từ điển

>>> import array
>>> arr = array.array["f", [1.0, 1.5, 2.0, 2.5]]
>>> arr[1]
1.5

>>> # Arrays have a nice repr:
>>> arr
array['f', [1.0, 1.5, 2.0, 2.5]]

>>> # Arrays are mutable:
>>> arr[1] = 23.0
>>> arr
array['f', [1.0, 23.0, 2.0, 2.5]]

>>> del arr[1]
>>> arr
array['f', [1.0, 2.0, 2.5]]

>>> arr.append[42.0]
>>> arr
array['f', [1.0, 2.0, 2.5, 42.0]]

>>> # Arrays are "typed":
>>> arr[1] = "hello"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: must be real number, not str
0 có thể hữu ích nếu, ví dụ, bạn muốn trả lại một từ điển mang trạng thái bên trong từ một lớp hoặc mô-đun trong khi không khuyến khích ghi quyền truy cập vào đối tượng này. Sử dụng
>>> import array
>>> arr = array.array["f", [1.0, 1.5, 2.0, 2.5]]
>>> arr[1]
1.5

>>> # Arrays have a nice repr:
>>> arr
array['f', [1.0, 1.5, 2.0, 2.5]]

>>> # Arrays are mutable:
>>> arr[1] = 23.0
>>> arr
array['f', [1.0, 23.0, 2.0, 2.5]]

>>> del arr[1]
>>> arr
array['f', [1.0, 2.0, 2.5]]

>>> arr.append[42.0]
>>> arr
array['f', [1.0, 2.0, 2.5, 42.0]]

>>> # Arrays are "typed":
>>> arr[1] = "hello"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: must be real number, not str
0 cho phép bạn áp dụng các hạn chế này mà không cần phải tạo một bản sao đầy đủ của từ điển trước

>>>

>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]

Từ điển trong Python. Tóm lược

Tất cả các triển khai từ điển Python được liệt kê trong hướng dẫn này là các triển khai hợp lệ được tích hợp trong thư viện chuẩn Python

Nếu bạn đang tìm kiếm một đề xuất chung về loại ánh xạ nào sẽ được sử dụng trong các chương trình của mình, thì tôi sẽ chỉ cho bạn loại dữ liệu

>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
0 được tích hợp sẵn. Đó là một triển khai bảng băm linh hoạt và được tối ưu hóa được tích hợp trực tiếp vào ngôn ngữ cốt lõi

Tôi khuyên bạn chỉ nên sử dụng một trong các loại dữ liệu khác được liệt kê ở đây nếu bạn có các yêu cầu đặc biệt vượt quá những gì được cung cấp bởi

>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
0

Tất cả các triển khai đều là các tùy chọn hợp lệ, nhưng mã của bạn sẽ rõ ràng hơn và dễ bảo trì hơn nếu nó luôn dựa vào các từ điển Python tiêu chuẩn

Cấu trúc dữ liệu mảng

Mảng là một cấu trúc dữ liệu cơ bản có sẵn trong hầu hết các ngôn ngữ lập trình và nó có nhiều cách sử dụng trên các thuật toán khác nhau

Trong phần này, bạn sẽ xem xét các triển khai mảng trong Python chỉ sử dụng các tính năng hoặc chức năng ngôn ngữ cốt lõi có trong thư viện chuẩn của Python. Bạn sẽ thấy điểm mạnh và điểm yếu của từng phương pháp để bạn có thể quyết định cách triển khai nào phù hợp với trường hợp sử dụng của mình

Nhưng trước khi bắt đầu, trước tiên chúng ta hãy đề cập đến một số điều cơ bản. Mảng hoạt động như thế nào và chúng được sử dụng để làm gì?

Vì mảng lưu trữ thông tin trong các khối bộ nhớ liền kề, nên chúng được coi là cấu trúc dữ liệu liền kề [ví dụ: trái ngược với cấu trúc dữ liệu được liên kết như danh sách được liên kết]

Một sự tương tự trong thế giới thực cho cấu trúc dữ liệu mảng là một bãi đậu xe. Bạn có thể xem toàn bộ bãi đậu xe và coi nó như một đối tượng duy nhất, nhưng bên trong bãi đậu xe có các điểm đỗ xe được lập chỉ mục bằng một số duy nhất. Điểm đỗ xe là nơi chứa phương tiện—mỗi điểm đỗ xe có thể trống hoặc có ô tô, xe máy hoặc một số phương tiện khác đỗ trên đó

Nhưng không phải tất cả các bãi đậu xe đều giống nhau. Một số bãi đậu xe có thể chỉ được giới hạn cho một loại phương tiện. Ví dụ: một bãi đậu xe máy sẽ không cho phép đậu xe đạp trên đó. Bãi đỗ xe bị hạn chế tương ứng với cấu trúc dữ liệu mảng đã nhập chỉ cho phép các phần tử có cùng kiểu dữ liệu được lưu trữ trong đó

Về mặt hiệu suất, rất nhanh để tra cứu một phần tử có trong một mảng với chỉ mục của phần tử đó. Việc triển khai mảng phù hợp đảm bảo thời gian truy cập O[1] không đổi cho trường hợp này

Python bao gồm một số cấu trúc dữ liệu dạng mảng trong thư viện chuẩn của nó, mỗi cấu trúc có các đặc điểm hơi khác nhau. Hãy cùng xem

Loại bỏ các quảng cáo

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
6. Mảng động có thể thay đổi

là một phần của ngôn ngữ Python cốt lõi. Bất chấp tên của chúng, các danh sách của Python được triển khai dưới dạng các mảng động đằng sau hậu trường

Điều này có nghĩa là danh sách cho phép thêm hoặc xóa các phần tử và danh sách sẽ tự động điều chỉnh kho lưu trữ sao lưu chứa các phần tử này bằng cách cấp phát hoặc giải phóng bộ nhớ

Danh sách Python có thể chứa các phần tử tùy ý—mọi thứ đều là một đối tượng trong Python, kể cả các hàm. Do đó, bạn có thể kết hợp và kết hợp các loại dữ liệu khác nhau và lưu trữ tất cả chúng trong một danh sách duy nhất

Đây có thể là một tính năng mạnh mẽ, nhưng nhược điểm là việc hỗ trợ nhiều loại dữ liệu cùng lúc có nghĩa là dữ liệu thường ít được đóng gói chặt chẽ hơn. Kết quả là, toàn bộ cấu trúc chiếm nhiều không gian hơn

>>>

>>> arr = ["one", "two", "three"]
>>> arr[0]
'one'

>>> # Lists have a nice repr:
>>> arr
['one', 'two', 'three']

>>> # Lists are mutable:
>>> arr[1] = "hello"
>>> arr
['one', 'hello', 'three']

>>> del arr[1]
>>> arr
['one', 'three']

>>> # Lists can hold arbitrary data types:
>>> arr.append[23]
>>> arr
['one', 'three', 23]

>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
4. Container bất biến

Giống như danh sách, là một phần của ngôn ngữ cốt lõi Python. Tuy nhiên, không giống như các danh sách, các đối tượng

>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
4 của Python là bất biến. Điều này có nghĩa là không thể thêm hoặc xóa các phần tử một cách linh hoạt—tất cả các phần tử trong một bộ phải được xác định tại thời điểm tạo

Bộ dữ liệu là một cấu trúc dữ liệu khác có thể chứa các phần tử của các kiểu dữ liệu tùy ý. Tính linh hoạt này rất mạnh mẽ, nhưng một lần nữa, điều đó cũng có nghĩa là dữ liệu được đóng gói ít chặt chẽ hơn so với trong một mảng đã nhập

>>>

>>> arr = ["one", "two", "three"]
>>> arr[0]
'one'

>>> # Tuples have a nice repr:
>>> arr
['one', 'two', 'three']

>>> # Tuples are immutable:
>>> arr[1] = "hello"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'tuple' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'tuple' object doesn't support item deletion

>>> # Tuples can hold arbitrary data types:
>>> # [Adding elements creates a copy of the tuple]
>>> arr + [23,]
['one', 'two', 'three', 23]

>>> import array
>>> arr = array.array["f", [1.0, 1.5, 2.0, 2.5]]
>>> arr[1]
1.5

>>> # Arrays have a nice repr:
>>> arr
array['f', [1.0, 1.5, 2.0, 2.5]]

>>> # Arrays are mutable:
>>> arr[1] = 23.0
>>> arr
array['f', [1.0, 23.0, 2.0, 2.5]]

>>> del arr[1]
>>> arr
array['f', [1.0, 2.0, 2.5]]

>>> arr.append[42.0]
>>> arr
array['f', [1.0, 2.0, 2.5, 42.0]]

>>> # Arrays are "typed":
>>> arr[1] = "hello"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: must be real number, not str
8. Mảng gõ cơ bản

Mô-đun

>>> import array
>>> arr = array.array["f", [1.0, 1.5, 2.0, 2.5]]
>>> arr[1]
1.5

>>> # Arrays have a nice repr:
>>> arr
array['f', [1.0, 1.5, 2.0, 2.5]]

>>> # Arrays are mutable:
>>> arr[1] = 23.0
>>> arr
array['f', [1.0, 23.0, 2.0, 2.5]]

>>> del arr[1]
>>> arr
array['f', [1.0, 2.0, 2.5]]

>>> arr.append[42.0]
>>> arr
array['f', [1.0, 2.0, 2.5, 42.0]]

>>> # Arrays are "typed":
>>> arr[1] = "hello"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: must be real number, not str
9 của Python cung cấp khả năng lưu trữ tiết kiệm không gian cho các kiểu dữ liệu kiểu C cơ bản như byte, số nguyên 32 bit, số dấu phẩy động, v.v.

Mảng được tạo bằng lớp

>>> import array
>>> arr = array.array["f", [1.0, 1.5, 2.0, 2.5]]
>>> arr[1]
1.5

>>> # Arrays have a nice repr:
>>> arr
array['f', [1.0, 1.5, 2.0, 2.5]]

>>> # Arrays are mutable:
>>> arr[1] = 23.0
>>> arr
array['f', [1.0, 23.0, 2.0, 2.5]]

>>> del arr[1]
>>> arr
array['f', [1.0, 2.0, 2.5]]

>>> arr.append[42.0]
>>> arr
array['f', [1.0, 2.0, 2.5, 42.0]]

>>> # Arrays are "typed":
>>> arr[1] = "hello"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: must be real number, not str
8 có thể thay đổi và hoạt động tương tự như danh sách ngoại trừ một điểm khác biệt quan trọng. chúng là các mảng được nhập vào một kiểu dữ liệu duy nhất

Do ràng buộc này, các đối tượng

>>> import array
>>> arr = array.array["f", [1.0, 1.5, 2.0, 2.5]]
>>> arr[1]
1.5

>>> # Arrays have a nice repr:
>>> arr
array['f', [1.0, 1.5, 2.0, 2.5]]

>>> # Arrays are mutable:
>>> arr[1] = 23.0
>>> arr
array['f', [1.0, 23.0, 2.0, 2.5]]

>>> del arr[1]
>>> arr
array['f', [1.0, 2.0, 2.5]]

>>> arr.append[42.0]
>>> arr
array['f', [1.0, 2.0, 2.5, 42.0]]

>>> # Arrays are "typed":
>>> arr[1] = "hello"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: must be real number, not str
8 có nhiều phần tử sẽ tiết kiệm không gian hơn so với danh sách và bộ dữ liệu. Các phần tử được lưu trữ trong chúng được đóng gói chặt chẽ và điều này có thể hữu ích nếu bạn cần lưu trữ nhiều phần tử cùng loại

Ngoài ra, mảng hỗ trợ nhiều phương thức giống như danh sách thông thường và bạn có thể sử dụng chúng như một phương thức thay thế thả xuống mà không yêu cầu các thay đổi khác đối với mã ứng dụng của mình

>>>

>>> import array
>>> arr = array.array["f", [1.0, 1.5, 2.0, 2.5]]
>>> arr[1]
1.5

>>> # Arrays have a nice repr:
>>> arr
array['f', [1.0, 1.5, 2.0, 2.5]]

>>> # Arrays are mutable:
>>> arr[1] = 23.0
>>> arr
array['f', [1.0, 23.0, 2.0, 2.5]]

>>> del arr[1]
>>> arr
array['f', [1.0, 2.0, 2.5]]

>>> arr.append[42.0]
>>> arr
array['f', [1.0, 2.0, 2.5, 42.0]]

>>> # Arrays are "typed":
>>> arr[1] = "hello"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: must be real number, not str

>>> arr = "abcd"
>>> arr[1]
'b'

>>> arr
'abcd'

>>> # Strings are immutable:
>>> arr[1] = "e"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object doesn't support item deletion

>>> # Strings can be unpacked into a list to
>>> # get a mutable representation:
>>> list["abcd"]
['a', 'b', 'c', 'd']
>>> "".join[list["abcd"]]
'abcd'

>>> # Strings are recursive data structures:
>>> type["abc"]
""
>>> type["abc"[0]]
""
2. Mảng ký tự Unicode bất biến

Trăn 3. x sử dụng các đối tượng để lưu trữ dữ liệu văn bản dưới dạng các chuỗi ký tự Unicode bất biến. Nói một cách thực tế, điều đó có nghĩa là một

>>> arr = "abcd"
>>> arr[1]
'b'

>>> arr
'abcd'

>>> # Strings are immutable:
>>> arr[1] = "e"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object doesn't support item deletion

>>> # Strings can be unpacked into a list to
>>> # get a mutable representation:
>>> list["abcd"]
['a', 'b', 'c', 'd']
>>> "".join[list["abcd"]]
'abcd'

>>> # Strings are recursive data structures:
>>> type["abc"]
""
>>> type["abc"[0]]
""
2 là một mảng ký tự bất biến. Thật kỳ lạ, nó cũng là một cấu trúc dữ liệu đệ quy—mỗi ký tự trong một chuỗi tự nó là một đối tượng
>>> arr = "abcd"
>>> arr[1]
'b'

>>> arr
'abcd'

>>> # Strings are immutable:
>>> arr[1] = "e"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object doesn't support item deletion

>>> # Strings can be unpacked into a list to
>>> # get a mutable representation:
>>> list["abcd"]
['a', 'b', 'c', 'd']
>>> "".join[list["abcd"]]
'abcd'

>>> # Strings are recursive data structures:
>>> type["abc"]
""
>>> type["abc"[0]]
""
2 có độ dài 1

Các đối tượng chuỗi tiết kiệm không gian hiệu quả vì chúng được đóng gói chặt chẽ và chúng chuyên về một kiểu dữ liệu duy nhất. Nếu bạn đang lưu trữ văn bản Unicode, thì bạn nên sử dụng một chuỗi

Vì các chuỗi là bất biến trong Python, nên việc sửa đổi một chuỗi yêu cầu tạo một bản sao đã sửa đổi. Tương đương gần nhất với chuỗi có thể thay đổi là lưu trữ các ký tự riêng lẻ trong danh sách

>>>

>>> arr = "abcd"
>>> arr[1]
'b'

>>> arr
'abcd'

>>> # Strings are immutable:
>>> arr[1] = "e"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object doesn't support item deletion

>>> # Strings can be unpacked into a list to
>>> # get a mutable representation:
>>> list["abcd"]
['a', 'b', 'c', 'd']
>>> "".join[list["abcd"]]
'abcd'

>>> # Strings are recursive data structures:
>>> type["abc"]
""
>>> type["abc"[0]]
""

Loại bỏ các quảng cáo

>>> arr = "abcd"
>>> arr[1]
'b'

>>> arr
'abcd'

>>> # Strings are immutable:
>>> arr[1] = "e"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object doesn't support item deletion

>>> # Strings can be unpacked into a list to
>>> # get a mutable representation:
>>> list["abcd"]
['a', 'b', 'c', 'd']
>>> "".join[list["abcd"]]
'abcd'

>>> # Strings are recursive data structures:
>>> type["abc"]
""
>>> type["abc"[0]]
""
6. Mảng bất biến của byte đơn

các đối tượng là các chuỗi bất biến của các byte đơn hoặc số nguyên trong phạm vi 0 ≤ x ≤ 255. Về mặt khái niệm, đối tượng

>>> arr = "abcd"
>>> arr[1]
'b'

>>> arr
'abcd'

>>> # Strings are immutable:
>>> arr[1] = "e"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object doesn't support item deletion

>>> # Strings can be unpacked into a list to
>>> # get a mutable representation:
>>> list["abcd"]
['a', 'b', 'c', 'd']
>>> "".join[list["abcd"]]
'abcd'

>>> # Strings are recursive data structures:
>>> type["abc"]
""
>>> type["abc"[0]]
""
6 tương tự như đối tượng
>>> arr = "abcd"
>>> arr[1]
'b'

>>> arr
'abcd'

>>> # Strings are immutable:
>>> arr[1] = "e"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object doesn't support item deletion

>>> # Strings can be unpacked into a list to
>>> # get a mutable representation:
>>> list["abcd"]
['a', 'b', 'c', 'd']
>>> "".join[list["abcd"]]
'abcd'

>>> # Strings are recursive data structures:
>>> type["abc"]
""
>>> type["abc"[0]]
""
2 và bạn cũng có thể coi chúng là mảng byte bất biến

Giống như chuỗi,

>>> arr = "abcd"
>>> arr[1]
'b'

>>> arr
'abcd'

>>> # Strings are immutable:
>>> arr[1] = "e"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object doesn't support item deletion

>>> # Strings can be unpacked into a list to
>>> # get a mutable representation:
>>> list["abcd"]
['a', 'b', 'c', 'd']
>>> "".join[list["abcd"]]
'abcd'

>>> # Strings are recursive data structures:
>>> type["abc"]
""
>>> type["abc"[0]]
""
6 có cú pháp theo nghĩa đen riêng để tạo đối tượng và tiết kiệm không gian. Các đối tượng
>>> arr = "abcd"
>>> arr[1]
'b'

>>> arr
'abcd'

>>> # Strings are immutable:
>>> arr[1] = "e"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object doesn't support item deletion

>>> # Strings can be unpacked into a list to
>>> # get a mutable representation:
>>> list["abcd"]
['a', 'b', 'c', 'd']
>>> "".join[list["abcd"]]
'abcd'

>>> # Strings are recursive data structures:
>>> type["abc"]
""
>>> type["abc"[0]]
""
6 là bất biến, nhưng không giống như các chuỗi, có một kiểu dữ liệu mảng byte có thể thay đổi chuyên dụng được gọi là
>>> arr = bytes[[0, 1, 2, 3]]
>>> arr[1]
1

>>> # Bytes literals have their own syntax:
>>> arr
b'\x00\x01\x02\x03'
>>> arr = b"\x00\x01\x02\x03"

>>> # Only valid `bytes` are allowed:
>>> bytes[[0, 300]]
Traceback [most recent call last]:
  File "", line 1, in 
ValueError: bytes must be in range[0, 256]

>>> # Bytes are immutable:
>>> arr[1] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'bytes' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'bytes' object doesn't support item deletion
2 mà chúng có thể được giải nén thành

>>>

>>> arr = bytes[[0, 1, 2, 3]]
>>> arr[1]
1

>>> # Bytes literals have their own syntax:
>>> arr
b'\x00\x01\x02\x03'
>>> arr = b"\x00\x01\x02\x03"

>>> # Only valid `bytes` are allowed:
>>> bytes[[0, 300]]
Traceback [most recent call last]:
  File "", line 1, in 
ValueError: bytes must be in range[0, 256]

>>> # Bytes are immutable:
>>> arr[1] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'bytes' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'bytes' object doesn't support item deletion

>>> arr = bytes[[0, 1, 2, 3]]
>>> arr[1]
1

>>> # Bytes literals have their own syntax:
>>> arr
b'\x00\x01\x02\x03'
>>> arr = b"\x00\x01\x02\x03"

>>> # Only valid `bytes` are allowed:
>>> bytes[[0, 300]]
Traceback [most recent call last]:
  File "", line 1, in 
ValueError: bytes must be in range[0, 256]

>>> # Bytes are immutable:
>>> arr[1] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'bytes' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'bytes' object doesn't support item deletion
2. Mảng có thể thay đổi của byte đơn

Loại là một chuỗi các số nguyên có thể thay đổi trong phạm vi 0 ≤ x ≤ 255. Đối tượng

>>> arr = bytes[[0, 1, 2, 3]]
>>> arr[1]
1

>>> # Bytes literals have their own syntax:
>>> arr
b'\x00\x01\x02\x03'
>>> arr = b"\x00\x01\x02\x03"

>>> # Only valid `bytes` are allowed:
>>> bytes[[0, 300]]
Traceback [most recent call last]:
  File "", line 1, in 
ValueError: bytes must be in range[0, 256]

>>> # Bytes are immutable:
>>> arr[1] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'bytes' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'bytes' object doesn't support item deletion
2 có liên quan chặt chẽ với đối tượng
>>> arr = "abcd"
>>> arr[1]
'b'

>>> arr
'abcd'

>>> # Strings are immutable:
>>> arr[1] = "e"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object doesn't support item deletion

>>> # Strings can be unpacked into a list to
>>> # get a mutable representation:
>>> list["abcd"]
['a', 'b', 'c', 'd']
>>> "".join[list["abcd"]]
'abcd'

>>> # Strings are recursive data structures:
>>> type["abc"]
""
>>> type["abc"[0]]
""
6, với điểm khác biệt chính là đối tượng
>>> arr = bytes[[0, 1, 2, 3]]
>>> arr[1]
1

>>> # Bytes literals have their own syntax:
>>> arr
b'\x00\x01\x02\x03'
>>> arr = b"\x00\x01\x02\x03"

>>> # Only valid `bytes` are allowed:
>>> bytes[[0, 300]]
Traceback [most recent call last]:
  File "", line 1, in 
ValueError: bytes must be in range[0, 256]

>>> # Bytes are immutable:
>>> arr[1] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'bytes' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'bytes' object doesn't support item deletion
2 có thể được sửa đổi tự do—bạn có thể ghi đè lên các phần tử, loại bỏ các phần tử hiện có hoặc thêm phần tử mới. Đối tượng
>>> arr = bytes[[0, 1, 2, 3]]
>>> arr[1]
1

>>> # Bytes literals have their own syntax:
>>> arr
b'\x00\x01\x02\x03'
>>> arr = b"\x00\x01\x02\x03"

>>> # Only valid `bytes` are allowed:
>>> bytes[[0, 300]]
Traceback [most recent call last]:
  File "", line 1, in 
ValueError: bytes must be in range[0, 256]

>>> # Bytes are immutable:
>>> arr[1] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'bytes' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'bytes' object doesn't support item deletion
2 sẽ phát triển và thu nhỏ tương ứng

Một

>>> arr = bytes[[0, 1, 2, 3]]
>>> arr[1]
1

>>> # Bytes literals have their own syntax:
>>> arr
b'\x00\x01\x02\x03'
>>> arr = b"\x00\x01\x02\x03"

>>> # Only valid `bytes` are allowed:
>>> bytes[[0, 300]]
Traceback [most recent call last]:
  File "", line 1, in 
ValueError: bytes must be in range[0, 256]

>>> # Bytes are immutable:
>>> arr[1] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'bytes' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'bytes' object doesn't support item deletion
2 có thể được chuyển đổi trở lại thành các đối tượng
>>> arr = "abcd"
>>> arr[1]
'b'

>>> arr
'abcd'

>>> # Strings are immutable:
>>> arr[1] = "e"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object doesn't support item deletion

>>> # Strings can be unpacked into a list to
>>> # get a mutable representation:
>>> list["abcd"]
['a', 'b', 'c', 'd']
>>> "".join[list["abcd"]]
'abcd'

>>> # Strings are recursive data structures:
>>> type["abc"]
""
>>> type["abc"[0]]
""
6 bất biến, nhưng điều này liên quan đến việc sao chép toàn bộ dữ liệu được lưu trữ—một thao tác chậm mất thời gian O[n]

>>>

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
0

Mảng trong Python. Tóm lược

Có một số cấu trúc dữ liệu tích hợp sẵn mà bạn có thể chọn khi triển khai mảng trong Python. Trong phần này, bạn đã tập trung vào các tính năng cốt lõi của ngôn ngữ và cấu trúc dữ liệu có trong thư viện chuẩn

Nếu bạn sẵn sàng vượt ra ngoài thư viện tiêu chuẩn của Python, thì các gói của bên thứ ba như NumPy và gấu trúc sẽ cung cấp nhiều cách triển khai mảng nhanh cho khoa học dữ liệu và điện toán khoa học

Nếu bạn muốn giới hạn bản thân trong các cấu trúc dữ liệu mảng có trong Python, thì đây là một số hướng dẫn

  • Nếu bạn cần lưu trữ các đối tượng tùy ý, có khả năng chứa các loại dữ liệu hỗn hợp, thì hãy sử dụng

    >>> from collections import ChainMap
    >>> dict1 = {"one": 1, "two": 2}
    >>> dict2 = {"three": 3, "four": 4}
    >>> chain = ChainMap[dict1, dict2]
    
    >>> chain
    ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]
    
    >>> # ChainMap searches each collection in the chain
    >>> # from left to right until it finds the key [or fails]:
    >>> chain["three"]
    3
    >>> chain["one"]
    1
    >>> chain["missing"]
    Traceback [most recent call last]:
      File "", line 1, in 
    KeyError: 'missing'
    
    6 hoặc
    >>> from types import MappingProxyType
    >>> writable = {"one": 1, "two": 2}
    >>> read_only = MappingProxyType[writable]
    
    >>> # The proxy is read-only:
    >>> read_only["one"]
    1
    >>> read_only["one"] = 23
    Traceback [most recent call last]:
      File "", line 1, in 
    TypeError: 'mappingproxy' object does not support item assignment
    
    >>> # Updates to the original are reflected in the proxy:
    >>> writable["one"] = 42
    >>> read_only
    mappingproxy[{'one': 42, 'two': 2}]
    
    4, tùy thuộc vào việc bạn có muốn cấu trúc dữ liệu bất biến hay không

  • Nếu bạn có dữ liệu số [số nguyên hoặc dấu chấm động] và đóng gói chặt chẽ và hiệu suất là quan trọng, thì hãy dùng thử

    >>> import array
    >>> arr = array.array["f", [1.0, 1.5, 2.0, 2.5]]
    >>> arr[1]
    1.5
    
    >>> # Arrays have a nice repr:
    >>> arr
    array['f', [1.0, 1.5, 2.0, 2.5]]
    
    >>> # Arrays are mutable:
    >>> arr[1] = 23.0
    >>> arr
    array['f', [1.0, 23.0, 2.0, 2.5]]
    
    >>> del arr[1]
    >>> arr
    array['f', [1.0, 2.0, 2.5]]
    
    >>> arr.append[42.0]
    >>> arr
    array['f', [1.0, 2.0, 2.5, 42.0]]
    
    >>> # Arrays are "typed":
    >>> arr[1] = "hello"
    Traceback [most recent call last]:
      File "", line 1, in 
    TypeError: must be real number, not str
    
    8

  • Nếu bạn có dữ liệu văn bản được biểu thị dưới dạng ký tự Unicode, thì hãy sử dụng

    >>> arr = "abcd"
    >>> arr[1]
    'b'
    
    >>> arr
    'abcd'
    
    >>> # Strings are immutable:
    >>> arr[1] = "e"
    Traceback [most recent call last]:
      File "", line 1, in 
    TypeError: 'str' object does not support item assignment
    
    >>> del arr[1]
    Traceback [most recent call last]:
      File "", line 1, in 
    TypeError: 'str' object doesn't support item deletion
    
    >>> # Strings can be unpacked into a list to
    >>> # get a mutable representation:
    >>> list["abcd"]
    ['a', 'b', 'c', 'd']
    >>> "".join[list["abcd"]]
    'abcd'
    
    >>> # Strings are recursive data structures:
    >>> type["abc"]
    ""
    >>> type["abc"[0]]
    ""
    
    2 tích hợp sẵn của Python. Nếu bạn cần cấu trúc dữ liệu dạng chuỗi có thể thay đổi, thì hãy sử dụng
    >>> from collections import ChainMap
    >>> dict1 = {"one": 1, "two": 2}
    >>> dict2 = {"three": 3, "four": 4}
    >>> chain = ChainMap[dict1, dict2]
    
    >>> chain
    ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]
    
    >>> # ChainMap searches each collection in the chain
    >>> # from left to right until it finds the key [or fails]:
    >>> chain["three"]
    3
    >>> chain["one"]
    1
    >>> chain["missing"]
    Traceback [most recent call last]:
      File "", line 1, in 
    KeyError: 'missing'
    
    6 ký tự

  • Nếu bạn muốn lưu trữ một khối byte liền kề, thì hãy sử dụng loại

    >>> arr = "abcd"
    >>> arr[1]
    'b'
    
    >>> arr
    'abcd'
    
    >>> # Strings are immutable:
    >>> arr[1] = "e"
    Traceback [most recent call last]:
      File "", line 1, in 
    TypeError: 'str' object does not support item assignment
    
    >>> del arr[1]
    Traceback [most recent call last]:
      File "", line 1, in 
    TypeError: 'str' object doesn't support item deletion
    
    >>> # Strings can be unpacked into a list to
    >>> # get a mutable representation:
    >>> list["abcd"]
    ['a', 'b', 'c', 'd']
    >>> "".join[list["abcd"]]
    'abcd'
    
    >>> # Strings are recursive data structures:
    >>> type["abc"]
    ""
    >>> type["abc"[0]]
    ""
    
    6 bất biến hoặc
    >>> arr = bytes[[0, 1, 2, 3]]
    >>> arr[1]
    1
    
    >>> # Bytes literals have their own syntax:
    >>> arr
    b'\x00\x01\x02\x03'
    >>> arr = b"\x00\x01\x02\x03"
    
    >>> # Only valid `bytes` are allowed:
    >>> bytes[[0, 300]]
    Traceback [most recent call last]:
      File "", line 1, in 
    ValueError: bytes must be in range[0, 256]
    
    >>> # Bytes are immutable:
    >>> arr[1] = 23
    Traceback [most recent call last]:
      File "", line 1, in 
    TypeError: 'bytes' object does not support item assignment
    
    >>> del arr[1]
    Traceback [most recent call last]:
      File "", line 1, in 
    TypeError: 'bytes' object doesn't support item deletion
    
    2 nếu bạn cần cấu trúc dữ liệu có thể thay đổi

Trong hầu hết các trường hợp, tôi muốn bắt đầu với một

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
6 đơn giản. Sau này tôi sẽ chỉ chuyên sâu nếu hiệu suất hoặc dung lượng lưu trữ trở thành vấn đề. Hầu hết thời gian, việc sử dụng cấu trúc dữ liệu mảng có mục đích chung như
>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
6 mang lại cho bạn tốc độ phát triển nhanh nhất và sự tiện lợi nhất khi lập trình

Tôi nhận thấy rằng điều này ngay từ đầu thường quan trọng hơn nhiều so với việc cố gắng vắt kiệt từng giọt hiệu suất cuối cùng ngay từ đầu

Bản ghi, cấu trúc và đối tượng truyền dữ liệu

So với mảng, cấu trúc dữ liệu bản ghi cung cấp một số trường cố định. Mỗi trường có thể có tên và cũng có thể có kiểu khác

Trong phần này, bạn sẽ thấy cách triển khai các bản ghi, cấu trúc và các đối tượng dữ liệu cũ thuần túy trong Python chỉ sử dụng các loại và lớp dữ liệu tích hợp sẵn từ thư viện chuẩn

Ghi chú. Tôi đang sử dụng định nghĩa của một bản ghi một cách lỏng lẻo ở đây. Ví dụ: tôi cũng sẽ thảo luận về các loại như

>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
4 tích hợp sẵn của Python có thể hoặc không thể được coi là bản ghi theo nghĩa chặt chẽ vì chúng không cung cấp các trường được đặt tên

Python cung cấp một số loại dữ liệu mà bạn có thể sử dụng để triển khai các bản ghi, cấu trúc và đối tượng truyền dữ liệu. Trong phần này, bạn sẽ xem nhanh từng triển khai và các đặc điểm riêng của nó. Cuối cùng, bạn sẽ tìm thấy một bản tóm tắt và hướng dẫn ra quyết định sẽ giúp bạn đưa ra lựa chọn của riêng mình

Ghi chú. Hướng dẫn này được chuyển thể từ chương “Cấu trúc dữ liệu chung trong Python” trong Thủ thuật Python. Quyển sách. Nếu bạn thích những gì bạn đang đọc, thì hãy nhớ xem phần còn lại của cuốn sách

Được rồi, chúng ta hãy bắt đầu

Loại bỏ các quảng cáo

>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
0. Đối tượng dữ liệu đơn giản

Như đã đề cập, từ điển Python lưu trữ một số đối tượng tùy ý, mỗi đối tượng được xác định bằng một khóa duy nhất. Từ điển cũng thường được gọi là bản đồ hoặc mảng kết hợp và cho phép tra cứu, chèn và xóa hiệu quả bất kỳ đối tượng nào được liên kết với một khóa đã cho

Có thể sử dụng từ điển làm kiểu dữ liệu bản ghi hoặc đối tượng dữ liệu trong Python. Từ điển rất dễ tạo bằng Python vì chúng có đường cú pháp riêng được tích hợp vào ngôn ngữ dưới dạng chữ từ điển. Cú pháp từ điển ngắn gọn và khá thuận tiện để gõ

Các đối tượng dữ liệu được tạo bằng từ điển có thể thay đổi được và có rất ít sự bảo vệ đối với tên trường sai chính tả vì các trường có thể được thêm và xóa tự do bất kỳ lúc nào. Cả hai thuộc tính này đều có thể gây ra các lỗi đáng ngạc nhiên và luôn có sự đánh đổi giữa sự thuận tiện và khả năng phục hồi lỗi

>>>

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
1

>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
4. Nhóm đối tượng bất biến

Bộ dữ liệu Python là một cấu trúc dữ liệu đơn giản để nhóm các đối tượng tùy ý. Các bộ dữ liệu là bất biến—chúng không thể được sửa đổi sau khi chúng được tạo

Về mặt hiệu suất, các bộ dữ liệu chiếm hơn , và chúng cũng nhanh hơn để xây dựng

Như bạn có thể thấy trong phần phân tách mã byte bên dưới, việc xây dựng một hằng số bộ cần một mã lệnh

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
13 duy nhất, trong khi việc xây dựng một đối tượng danh sách có cùng nội dung yêu cầu thêm một số thao tác

>>>

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
2

Tuy nhiên, bạn không nên quá chú trọng vào những điểm khác biệt này. Trong thực tế, sự khác biệt về hiệu suất thường sẽ không đáng kể và việc cố gắng loại bỏ hiệu suất bổ sung ra khỏi chương trình bằng cách chuyển từ danh sách sang bộ dữ liệu có thể sẽ là cách tiếp cận sai lầm.

Một nhược điểm tiềm năng của các bộ dữ liệu đơn giản là dữ liệu bạn lưu trữ trong chúng chỉ có thể được lấy ra bằng cách truy cập nó thông qua các chỉ mục số nguyên. Bạn không thể đặt tên cho các thuộc tính riêng lẻ được lưu trữ trong một bộ. Điều này có thể ảnh hưởng đến khả năng đọc mã

Ngoài ra, một tuple luôn là một cấu trúc đặc biệt. rất khó để đảm bảo rằng hai bộ dữ liệu có cùng số lượng trường và cùng thuộc tính được lưu trữ trong chúng

Điều này giúp dễ dàng đưa ra các lỗi sơ ý, chẳng hạn như trộn lẫn thứ tự trường. Do đó, tôi khuyên bạn nên giữ số lượng trường được lưu trữ trong một bộ dữ liệu càng thấp càng tốt

>>>

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
3

Viết một lớp tùy chỉnh. Làm việc nhiều hơn, kiểm soát nhiều hơn

Các lớp cho phép bạn xác định các bản thiết kế có thể tái sử dụng cho các đối tượng dữ liệu để đảm bảo mỗi đối tượng cung cấp cùng một tập hợp các trường

Sử dụng các lớp Python thông thường làm kiểu dữ liệu bản ghi là khả thi, nhưng cũng cần thực hiện thủ công để có được các tính năng tiện lợi của các triển khai khác. Ví dụ: việc thêm các trường mới vào hàm tạo

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
14 dài dòng và mất thời gian

Ngoài ra, biểu diễn chuỗi mặc định cho các đối tượng được khởi tạo từ các lớp tùy chỉnh không hữu ích lắm. Để khắc phục điều đó, bạn có thể phải thêm phương thức của riêng mình, phương thức này lại thường khá dài dòng và phải được cập nhật mỗi khi bạn thêm trường mới

Các trường được lưu trữ trên các lớp có thể thay đổi và các trường mới có thể được thêm tự do, bạn có thể thích hoặc không thích. Có thể cung cấp nhiều quyền kiểm soát truy cập hơn và tạo các trường chỉ đọc bằng trình trang trí, nhưng một lần nữa, điều này yêu cầu viết nhiều mã keo hơn

Viết một lớp tùy chỉnh là một tùy chọn tuyệt vời bất cứ khi nào bạn muốn thêm hành vi và logic nghiệp vụ vào các đối tượng bản ghi của mình bằng các phương thức. Tuy nhiên, điều này có nghĩa là các đối tượng này về mặt kỹ thuật không còn là đối tượng dữ liệu thuần túy nữa.

>>>

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
4

Loại bỏ các quảng cáo

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
17. Trăn 3. Hơn 7 lớp dữ liệu

Các lớp dữ liệu có sẵn trong Python 3. 7 trở lên. Chúng cung cấp một giải pháp thay thế tuyệt vời để xác định các lớp lưu trữ dữ liệu của riêng bạn từ đầu

Bằng cách viết một lớp dữ liệu thay vì một lớp Python thuần túy, các thể hiện đối tượng của bạn sẽ nhận được một vài tính năng hữu ích giúp bạn tiết kiệm một số công việc đánh máy và triển khai thủ công

  • Cú pháp để xác định các biến thể hiện ngắn hơn, vì bạn không cần triển khai phương thức
    >>> import collections
    >>> d = collections.OrderedDict[one=1, two=2, three=3]
    
    >>> d
    OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]
    
    >>> d["four"] = 4
    >>> d
    OrderedDict[[['one', 1], ['two', 2],
                 ['three', 3], ['four', 4]]]
    
    >>> d.keys[]
    odict_keys[['one', 'two', 'three', 'four']]
    
    18
  • Các thể hiện của lớp dữ liệu của bạn sẽ tự động nhận được biểu diễn chuỗi đẹp mắt thông qua phương thức
    >>> import collections
    >>> d = collections.OrderedDict[one=1, two=2, three=3]
    
    >>> d
    OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]
    
    >>> d["four"] = 4
    >>> d
    OrderedDict[[['one', 1], ['two', 2],
                 ['three', 3], ['four', 4]]]
    
    >>> d.keys[]
    odict_keys[['one', 'two', 'three', 'four']]
    
    19 được tạo tự động
  • Các biến thể hiện chấp nhận các chú thích kiểu, làm cho lớp dữ liệu của bạn tự ghi lại ở một mức độ nào đó. Hãy nhớ rằng chú thích loại chỉ là gợi ý không được thực thi nếu không có công cụ kiểm tra loại riêng

Các lớp dữ liệu thường được tạo bằng cách sử dụng trình trang trí

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
20, như bạn sẽ thấy trong ví dụ mã bên dưới

>>>

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
5

Để tìm hiểu thêm về các lớp dữ liệu Python, hãy xem Hướng dẫn cơ bản về các lớp dữ liệu trong Python 3. 7

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
21. Đối tượng dữ liệu thuận tiện

Lớp

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
22 có sẵn trong Python 2. 6+ cung cấp phần mở rộng của kiểu dữ liệu
>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
4 tích hợp. Tương tự như xác định một lớp tùy chỉnh, việc sử dụng
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
22 cho phép bạn xác định các bản thiết kế có thể tái sử dụng cho bản ghi của mình để đảm bảo sử dụng đúng tên trường

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
22 đối tượng là bất biến, giống như các bộ dữ liệu thông thường. Điều này có nghĩa là bạn không thể thêm các trường mới hoặc sửa đổi các trường hiện có sau khi phiên bản
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
22 được tạo

Bên cạnh đó, các đối tượng

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
22, tốt.  .  . bộ dữ liệu được đặt tên. Mỗi đối tượng được lưu trữ trong chúng có thể được truy cập thông qua một mã định danh duy nhất. Điều này giải phóng bạn khỏi việc phải nhớ các chỉ mục số nguyên hoặc sử dụng các giải pháp thay thế như xác định các hằng số nguyên dưới dạng ghi nhớ cho các chỉ mục của bạn

Các đối tượng

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
22 được triển khai như các lớp Python thông thường trong nội bộ. Khi nói đến việc sử dụng bộ nhớ, chúng cũng tốt hơn các lớp thông thường và bộ nhớ hiệu quả như các bộ thông thường

>>>

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
6

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
22 đối tượng có thể là một cách dễ dàng để làm sạch mã của bạn và làm cho mã dễ đọc hơn bằng cách thực thi một cấu trúc tốt hơn cho dữ liệu của bạn

Tôi nhận thấy rằng việc chuyển từ các loại dữ liệu đặc biệt như từ điển có định dạng cố định sang các đối tượng

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
22 giúp tôi thể hiện mục đích mã của mình rõ ràng hơn. Thường thì khi tôi áp dụng cách tái cấu trúc này, tôi đã tìm ra một giải pháp tốt hơn một cách kỳ diệu cho vấn đề mà tôi đang gặp phải

Sử dụng các đối tượng

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
22 trên các bộ dữ liệu và lệnh chính xác [không có cấu trúc] thông thường cũng có thể giúp cuộc sống của đồng nghiệp của bạn dễ dàng hơn bằng cách làm cho dữ liệu được truyền xung quanh tự ghi lại, ít nhất là ở một mức độ nào đó

>>>

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
7

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
32. Bộ tên được cải tiến

Đã thêm vào Python 3. 6, là em của lớp

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
22 trong học phần
>>> arr = ["one", "two", "three"]
>>> arr[0]
'one'

>>> # Lists have a nice repr:
>>> arr
['one', 'two', 'three']

>>> # Lists are mutable:
>>> arr[1] = "hello"
>>> arr
['one', 'hello', 'three']

>>> del arr[1]
>>> arr
['one', 'three']

>>> # Lists can hold arbitrary data types:
>>> arr.append[23]
>>> arr
['one', 'three', 23]
1. Nó rất giống với
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
22, với điểm khác biệt chính là cú pháp được cập nhật để xác định loại bản ghi mới và hỗ trợ thêm cho gợi ý loại

Xin lưu ý rằng chú thích loại không được thực thi nếu không có công cụ kiểm tra loại riêng biệt như mypy. Nhưng ngay cả khi không có công cụ hỗ trợ, chúng vẫn có thể cung cấp các gợi ý hữu ích cho các lập trình viên khác [hoặc cực kỳ khó hiểu nếu các gợi ý kiểu đã lỗi thời]

>>>

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
8

Loại bỏ các quảng cáo

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
37. Cấu trúc C nối tiếp

Lớp chuyển đổi giữa các giá trị Python và cấu trúc C được tuần tự hóa thành các đối tượng Python

>>> arr = "abcd"
>>> arr[1]
'b'

>>> arr
'abcd'

>>> # Strings are immutable:
>>> arr[1] = "e"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object does not support item assignment

>>> del arr[1]
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object doesn't support item deletion

>>> # Strings can be unpacked into a list to
>>> # get a mutable representation:
>>> list["abcd"]
['a', 'b', 'c', 'd']
>>> "".join[list["abcd"]]
'abcd'

>>> # Strings are recursive data structures:
>>> type["abc"]
""
>>> type["abc"[0]]
""
6. Ví dụ: nó có thể được sử dụng để xử lý dữ liệu nhị phân được lưu trữ trong các tệp hoặc đến từ các kết nối mạng

Các cấu trúc được xác định bằng một ngôn ngữ nhỏ dựa trên ngôn ngữ đó cho phép bạn xác định cách sắp xếp của các loại dữ liệu C khác nhau như

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
40,
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
41 và
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
42 cũng như các biến thể
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
43 của chúng

Các cấu trúc nối tiếp hiếm khi được sử dụng để biểu diễn các đối tượng dữ liệu được xử lý hoàn toàn bên trong mã Python. Chúng được dự định chủ yếu dưới dạng định dạng trao đổi dữ liệu chứ không phải là cách lưu trữ dữ liệu trong bộ nhớ chỉ được sử dụng bởi mã Python

Trong một số trường hợp, việc đóng gói dữ liệu nguyên thủy vào các cấu trúc có thể sử dụng ít bộ nhớ hơn so với việc giữ nó trong các kiểu dữ liệu khác. Tuy nhiên, trong hầu hết các trường hợp, đó sẽ là một tối ưu hóa khá nâng cao [và có lẽ không cần thiết]

>>>

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
9

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
44. Quyền truy cập thuộc tính ưa thích

Đây là một lựa chọn hơi khó hiểu hơn để triển khai các đối tượng dữ liệu trong Python. . Lớp này đã được thêm vào Python 3. 3 và cung cấp quyền truy cập thuộc tính vào không gian tên của nó

Điều này có nghĩa là các trường hợp

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
46 hiển thị tất cả các khóa của chúng dưới dạng thuộc tính lớp. Bạn có thể sử dụng quyền truy cập thuộc tính dấu chấm
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
47 thay vì cú pháp lập chỉ mục dấu ngoặc vuông
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
48 được sử dụng bởi các ký tự thông thường. Tất cả các trường hợp cũng bao gồm một
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
15 có ý nghĩa theo mặc định

Đúng như tên gọi của nó,

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
46 rất đơn giản. Về cơ bản, nó là một từ điển cho phép truy cập thuộc tính và in một cách độc đáo. Các thuộc tính có thể được thêm, sửa đổi và xóa tự do

>>>

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
0

Bản ghi, cấu trúc và đối tượng dữ liệu trong Python. Tóm lược

Như bạn đã thấy, có khá nhiều tùy chọn khác nhau để triển khai các bản ghi hoặc đối tượng dữ liệu. Bạn nên sử dụng loại nào cho các đối tượng dữ liệu trong Python?

  • Nếu bạn chỉ có một vài trường, thì việc sử dụng một đối tượng tuple đơn giản có thể ổn nếu thứ tự trường dễ nhớ hoặc tên trường không cần thiết. Ví dụ, nghĩ về một điểm

    >>> import collections
    >>> d = collections.OrderedDict[one=1, two=2, three=3]
    
    >>> d
    OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]
    
    >>> d["four"] = 4
    >>> d
    OrderedDict[[['one', 1], ['two', 2],
                 ['three', 3], ['four', 4]]]
    
    >>> d.keys[]
    odict_keys[['one', 'two', 'three', 'four']]
    
    51 trong không gian ba chiều

  • Nếu bạn cần các trường bất biến, thì các bộ dữ liệu đơn giản,

    >>> import collections
    >>> d = collections.OrderedDict[one=1, two=2, three=3]
    
    >>> d
    OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]
    
    >>> d["four"] = 4
    >>> d
    OrderedDict[[['one', 1], ['two', 2],
                 ['three', 3], ['four', 4]]]
    
    >>> d.keys[]
    odict_keys[['one', 'two', 'three', 'four']]
    
    21 và
    >>> import collections
    >>> d = collections.OrderedDict[one=1, two=2, three=3]
    
    >>> d
    OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]
    
    >>> d["four"] = 4
    >>> d
    OrderedDict[[['one', 1], ['two', 2],
                 ['three', 3], ['four', 4]]]
    
    >>> d.keys[]
    odict_keys[['one', 'two', 'three', 'four']]
    
    32 đều là những lựa chọn tốt

  • Nếu bạn cần khóa tên trường để tránh lỗi chính tả, thì

    >>> import collections
    >>> d = collections.OrderedDict[one=1, two=2, three=3]
    
    >>> d
    OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]
    
    >>> d["four"] = 4
    >>> d
    OrderedDict[[['one', 1], ['two', 2],
                 ['three', 3], ['four', 4]]]
    
    >>> d.keys[]
    odict_keys[['one', 'two', 'three', 'four']]
    
    21 và
    >>> import collections
    >>> d = collections.OrderedDict[one=1, two=2, three=3]
    
    >>> d
    OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]
    
    >>> d["four"] = 4
    >>> d
    OrderedDict[[['one', 1], ['two', 2],
                 ['three', 3], ['four', 4]]]
    
    >>> d.keys[]
    odict_keys[['one', 'two', 'three', 'four']]
    
    32 là bạn của bạn

  • Nếu bạn muốn giữ mọi thứ đơn giản, thì một đối tượng từ điển đơn giản có thể là một lựa chọn tốt do cú pháp thuận tiện gần giống với JSON

  • Nếu bạn cần toàn quyền kiểm soát cấu trúc dữ liệu của mình, thì đã đến lúc viết một lớp tùy chỉnh với setters và getters

  • Nếu bạn cần thêm hành vi [phương thức] vào đối tượng, thì bạn nên viết một lớp tùy chỉnh, từ đầu hoặc sử dụng trình trang trí

    >>> import collections
    >>> d = collections.OrderedDict[one=1, two=2, three=3]
    
    >>> d
    OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]
    
    >>> d["four"] = 4
    >>> d
    OrderedDict[[['one', 1], ['two', 2],
                 ['three', 3], ['four', 4]]]
    
    >>> d.keys[]
    odict_keys[['one', 'two', 'three', 'four']]
    
    57 hoặc bằng cách mở rộng
    >>> import collections
    >>> d = collections.OrderedDict[one=1, two=2, three=3]
    
    >>> d
    OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]
    
    >>> d["four"] = 4
    >>> d
    OrderedDict[[['one', 1], ['two', 2],
                 ['three', 3], ['four', 4]]]
    
    >>> d.keys[]
    odict_keys[['one', 'two', 'three', 'four']]
    
    21 hoặc
    >>> import collections
    >>> d = collections.OrderedDict[one=1, two=2, three=3]
    
    >>> d
    OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]
    
    >>> d["four"] = 4
    >>> d
    OrderedDict[[['one', 1], ['two', 2],
                 ['three', 3], ['four', 4]]]
    
    >>> d.keys[]
    odict_keys[['one', 'two', 'three', 'four']]
    
    32

  • Nếu bạn cần đóng gói dữ liệu chặt chẽ để đánh số thứ tự vào đĩa hoặc gửi qua mạng, thì đã đến lúc đọc trên

    >>> import collections
    >>> d = collections.OrderedDict[one=1, two=2, three=3]
    
    >>> d
    OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]
    
    >>> d["four"] = 4
    >>> d
    OrderedDict[[['one', 1], ['two', 2],
                 ['three', 3], ['four', 4]]]
    
    >>> d.keys[]
    odict_keys[['one', 'two', 'three', 'four']]
    
    37 vì đây là một trường hợp sử dụng tuyệt vời cho nó

Nếu bạn đang tìm kiếm một lựa chọn mặc định an toàn, thì đề xuất chung của tôi để triển khai một bản ghi, cấu trúc hoặc đối tượng dữ liệu đơn giản trong Python sẽ là sử dụng

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
21 trong Python 2. x và người em của nó,
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
32 trong Python 3

Bộ và Nhiều bộ

Trong phần này, bạn sẽ thấy cách triển khai các cấu trúc dữ liệu tập hợp và nhiều tập hợp [túi] có thể thay đổi và không thay đổi trong Python bằng cách sử dụng các loại và lớp dữ liệu tích hợp sẵn từ thư viện chuẩn

Tập hợp là tập hợp các đối tượng không có thứ tự không cho phép các phần tử trùng lặp. Thông thường, các tập hợp được sử dụng để kiểm tra nhanh một giá trị về tư cách thành viên trong tập hợp, để chèn hoặc xóa các giá trị mới khỏi một tập hợp và để tính toán hợp hoặc giao của hai tập hợp

Trong một triển khai được thiết lập phù hợp, các bài kiểm tra tư cách thành viên dự kiến ​​sẽ chạy trong thời gian O[1] nhanh. Các phép toán hợp, giao, hiệu và tập hợp con sẽ mất trung bình thời gian O[n]. Các triển khai đã đặt có trong thư viện chuẩn của Python tuân theo các đặc điểm hiệu suất này

Cũng giống như từ điển, các bộ được xử lý đặc biệt trong Python và có một số đường cú pháp giúp chúng dễ tạo. Ví dụ: cú pháp biểu thức tập hợp dấu ngoặc nhọn và cho phép bạn xác định các trường hợp tập hợp mới một cách thuận tiện

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
1

Nhưng hãy cẩn thận. Để tạo một tập hợp trống, bạn cần gọi hàm tạo

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
63. Việc sử dụng dấu ngoặc nhọn trống [______17_______64] là không rõ ràng và thay vào đó sẽ tạo ra một từ điển trống

Python và thư viện tiêu chuẩn của nó cung cấp một số cài đặt được thiết lập. Chúng ta hãy nhìn vào chúng

Loại bỏ các quảng cáo

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
65. Mục tiêu của bạn

Loại là triển khai tập hợp tích hợp trong Python. Nó có thể thay đổi và cho phép chèn và xóa các phần tử động

Các bộ của Python được hỗ trợ bởi kiểu dữ liệu

>>> from types import MappingProxyType
>>> writable = {"one": 1, "two": 2}
>>> read_only = MappingProxyType[writable]

>>> # The proxy is read-only:
>>> read_only["one"]
1
>>> read_only["one"] = 23
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'mappingproxy' object does not support item assignment

>>> # Updates to the original are reflected in the proxy:
>>> writable["one"] = 42
>>> read_only
mappingproxy[{'one': 42, 'two': 2}]
0 và chia sẻ các đặc điểm hiệu suất giống nhau. Bất kỳ đối tượng có thể được lưu trữ trong một tập hợp

>>>

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
2

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
68. Bộ bất biến

Lớp thực hiện một phiên bản bất biến của

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
65 không thể thay đổi sau khi nó được xây dựng

Các đối tượng

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
68 là tĩnh và chỉ cho phép các thao tác truy vấn trên các phần tử của chúng, không cho phép chèn hoặc xóa. Bởi vì các đối tượng
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
68 là tĩnh và có thể băm, nên chúng có thể được sử dụng làm khóa từ điển hoặc làm phần tử của một tập hợp khác, điều không thể thực hiện được với các đối tượng
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
65 thông thường [có thể thay đổi]

>>>

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
3

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
74. nhiều bộ

Lớp trong thư viện chuẩn Python triển khai một loại nhiều tập hợp hoặc túi cho phép các phần tử trong tập hợp có nhiều lần xuất hiện

Điều này hữu ích nếu bạn cần theo dõi không chỉ một phần tử có phải là một phần của tập hợp hay không mà còn bao nhiêu lần phần tử đó được bao gồm trong tập hợp

>>>

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
4

Một lưu ý đối với lớp

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
76 là bạn sẽ phải cẩn thận khi đếm số phần tử trong một đối tượng
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
76. Gọi
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
78 trả về số lượng phần tử duy nhất trong nhiều tập hợp, trong khi tổng số phần tử có thể được truy xuất bằng cách sử dụng
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
79

>>>

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
5

Sets và Multisets trong Python. Tóm lược

Bộ là một cấu trúc dữ liệu hữu ích và thường được sử dụng khác có trong Python và thư viện chuẩn của nó. Dưới đây là một vài hướng dẫn để quyết định nên sử dụng cái nào

  • Nếu bạn cần một bộ có thể thay đổi, thì hãy sử dụng loại
    >>> import collections
    >>> d = collections.OrderedDict[one=1, two=2, three=3]
    
    >>> d
    OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]
    
    >>> d["four"] = 4
    >>> d
    OrderedDict[[['one', 1], ['two', 2],
                 ['three', 3], ['four', 4]]]
    
    >>> d.keys[]
    odict_keys[['one', 'two', 'three', 'four']]
    
    65 tích hợp sẵn
  • Nếu bạn cần các đối tượng có thể băm có thể được sử dụng làm từ điển hoặc đặt khóa, thì hãy sử dụng
    >>> import collections
    >>> d = collections.OrderedDict[one=1, two=2, three=3]
    
    >>> d
    OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]
    
    >>> d["four"] = 4
    >>> d
    OrderedDict[[['one', 1], ['two', 2],
                 ['three', 3], ['four', 4]]]
    
    >>> d.keys[]
    odict_keys[['one', 'two', 'three', 'four']]
    
    68
  • Nếu bạn cần cấu trúc dữ liệu nhiều bộ hoặc túi, thì hãy sử dụng
    >>> import collections
    >>> d = collections.OrderedDict[one=1, two=2, three=3]
    
    >>> d
    OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]
    
    >>> d["four"] = 4
    >>> d
    OrderedDict[[['one', 1], ['two', 2],
                 ['three', 3], ['four', 4]]]
    
    >>> d.keys[]
    odict_keys[['one', 'two', 'three', 'four']]
    
    74

Ngăn xếp [LIFO]

A là một tập hợp các đối tượng hỗ trợ ngữ nghĩa Last-In/First-Out [LIFO] nhanh chóng để chèn và xóa. Không giống như danh sách hoặc mảng, ngăn xếp thường không cho phép truy cập ngẫu nhiên vào các đối tượng mà chúng chứa. Thao tác chèn và xóa cũng thường được gọi là đẩy và bật

Một phép loại suy hữu ích trong thế giới thực cho cấu trúc dữ liệu ngăn xếp là một chồng các tấm. Các đĩa mới được thêm vào trên cùng của ngăn xếp và vì các đĩa này rất quý và nặng nên chỉ có thể di chuyển đĩa trên cùng. Nói cách khác, tấm cuối cùng trong ngăn xếp phải là tấm đầu tiên được lấy ra [LIFO]. Để tiếp cận các tấm thấp hơn trong ngăn xếp, các tấm trên cùng phải được lấy ra từng cái một

Xét về mặt hiệu suất, việc triển khai ngăn xếp phù hợp dự kiến ​​sẽ mất O[1] thời gian cho các thao tác chèn và xóa

Ngăn xếp có nhiều ứng dụng trong thuật toán. Ví dụ: chúng được sử dụng trong phân tích cú pháp ngôn ngữ cũng như quản lý bộ nhớ thời gian chạy, dựa trên ngăn xếp cuộc gọi. Một thuật toán ngắn và đẹp sử dụng ngăn xếp là tìm kiếm theo chiều sâu [DFS] trên cấu trúc dữ liệu dạng cây hoặc biểu đồ

Python cung cấp một số triển khai ngăn xếp mà mỗi triển khai có các đặc điểm hơi khác nhau. Hãy xem xét chúng và so sánh đặc điểm của chúng

Loại bỏ các quảng cáo

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
6. Ngăn xếp đơn giản, tích hợp sẵn

Loại

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
6 tích hợp sẵn của Python vì nó hỗ trợ các thao tác đẩy và bật trong thời gian khấu hao O[1]

Các danh sách của Python được triển khai dưới dạng các mảng động bên trong, điều đó có nghĩa là đôi khi chúng cần thay đổi kích thước không gian lưu trữ cho các phần tử được lưu trữ trong chúng khi các phần tử được thêm hoặc xóa. Danh sách phân bổ quá mức lưu trữ sao lưu của nó để không phải mọi thao tác đẩy hoặc bật đều yêu cầu thay đổi kích thước. Kết quả là bạn nhận được độ phức tạp thời gian O[1] được khấu hao cho các thao tác này

Nhược điểm là điều này làm cho hiệu suất của chúng kém nhất quán hơn so với các thao tác chèn và xóa O[1] ổn định được cung cấp bởi triển khai dựa trên danh sách được liên kết [như bạn sẽ thấy bên dưới với

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
85]. Mặt khác, các danh sách cung cấp quyền truy cập ngẫu nhiên thời gian O[1] nhanh vào các phần tử trên ngăn xếp và đây có thể là một lợi ích bổ sung

Có một cảnh báo hiệu suất quan trọng mà bạn nên biết khi sử dụng danh sách dưới dạng ngăn xếp. Để có được hiệu suất khấu hao O[1] cho các lần chèn và xóa, các mục mới phải được thêm vào cuối danh sách bằng phương pháp

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
86 và xóa lại từ cuối bằng cách sử dụng ____17_______87. Để có hiệu suất tối ưu, các ngăn xếp dựa trên danh sách Python sẽ phát triển theo chỉ mục cao hơn và thu hẹp về phía thấp hơn

Thêm và xóa từ phía trước chậm hơn nhiều và mất O[n] thời gian, vì các phần tử hiện có phải được dịch chuyển xung quanh để nhường chỗ cho phần tử mới. Đây là một phản mẫu hiệu suất mà bạn nên tránh càng nhiều càng tốt

>>>

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
6

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
85. Ngăn xếp nhanh và mạnh mẽ

Lớp thực hiện hỗ trợ thêm và xóa các phần tử từ một trong hai đầu trong thời gian O[1] [không phân bổ]. Bởi vì deques hỗ trợ thêm và xóa các phần tử từ một trong hai đầu tốt như nhau, nên chúng có thể phục vụ cả dưới dạng hàng đợi và dưới dạng ngăn xếp

Các đối tượng

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
89 của Python được triển khai dưới dạng , mang lại cho chúng hiệu suất tuyệt vời và nhất quán để chèn và xóa các phần tử nhưng hiệu suất O[n] kém khi truy cập ngẫu nhiên các phần tử ở giữa ngăn xếp

Nhìn chung, nếu bạn đang tìm kiếm cấu trúc dữ liệu ngăn xếp trong thư viện chuẩn của Python có các đặc điểm hiệu suất của việc triển khai danh sách liên kết

>>>

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
7

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
92. Khóa ngữ nghĩa cho tính toán song song

Việc triển khai ngăn xếp trong thư viện chuẩn Python được đồng bộ hóa và cung cấp ngữ nghĩa khóa để hỗ trợ nhiều nhà sản xuất và người tiêu dùng đồng thời

Bên cạnh

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
93, mô-đun
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
95 chứa một số lớp khác triển khai hàng đợi nhiều nhà sản xuất, nhiều người tiêu dùng hữu ích cho tính toán song song

Tùy thuộc vào trường hợp sử dụng của bạn, ngữ nghĩa khóa có thể hữu ích hoặc chúng có thể phát sinh chi phí không cần thiết. Trong trường hợp này, tốt hơn hết bạn nên sử dụng

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
6 hoặc
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
89 làm ngăn xếp đa năng

>>>

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
8

Triển khai ngăn xếp trong Python. Tóm lược

Như bạn đã thấy, Python cung cấp một số triển khai cho cấu trúc dữ liệu ngăn xếp. Tất cả chúng đều có những đặc điểm hơi khác nhau cũng như sự đánh đổi về hiệu suất và cách sử dụng

Nếu bạn không tìm kiếm hỗ trợ xử lý song song [hoặc nếu bạn không muốn xử lý khóa và mở khóa theo cách thủ công], thì lựa chọn của bạn thuộc về loại

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
6 hoặc
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
85 tích hợp sẵn. Sự khác biệt nằm ở cấu trúc dữ liệu được sử dụng ở hậu trường và tính dễ sử dụng nói chung

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
6 được hỗ trợ bởi một mảng động, điều này làm cho nó trở nên tuyệt vời để truy cập ngẫu nhiên nhanh chóng nhưng đôi khi yêu cầu thay đổi kích thước khi các phần tử được thêm hoặc xóa

Danh sách phân bổ quá mức lưu trữ sao lưu của nó để không phải mọi thao tác đẩy hoặc bật đều yêu cầu thay đổi kích thước và bạn nhận được độ phức tạp thời gian O[1] được khấu hao cho các thao tác này. Nhưng bạn cần cẩn thận chỉ chèn và xóa các mục bằng cách sử dụng

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
86 và
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
87. Mặt khác, hiệu suất chậm lại thành O[n]

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
85 được hỗ trợ bởi danh sách liên kết đôi, giúp tối ưu hóa việc thêm và xóa ở cả hai đầu và cung cấp hiệu suất O[1] nhất quán cho các hoạt động này. Không chỉ hoạt động ổn định hơn, lớp
>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
89 còn dễ sử dụng hơn vì bạn không phải lo lắng về việc thêm hoặc bớt các mục từ sai mục đích

Tóm lại,

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
85 là một lựa chọn tuyệt vời để triển khai ngăn xếp [hàng đợi LIFO] trong Python

Loại bỏ các quảng cáo

Hàng đợi [FIFO]

Trong phần này, bạn sẽ thấy cách triển khai cấu trúc dữ liệu hàng đợi Nhập trước/Xuất trước [FIFO] chỉ sử dụng các loại và lớp dữ liệu tích hợp sẵn từ thư viện chuẩn Python

A là tập hợp các đối tượng hỗ trợ ngữ nghĩa FIFO nhanh để chèn và xóa. Thao tác chèn và xóa đôi khi được gọi là enqueue và dequeue. Không giống như danh sách hoặc mảng, hàng đợi thường không cho phép truy cập ngẫu nhiên vào các đối tượng mà chúng chứa

Đây là một sự tương tự trong thế giới thực cho hàng đợi FIFO

Hãy tưởng tượng một hàng Pythonistas đang chờ nhận huy hiệu hội nghị của họ vào ngày đầu tiên đăng ký PyCon. Khi những người mới vào địa điểm tổ chức hội nghị và xếp hàng để nhận huy hiệu của họ, họ sẽ xếp hàng [enqueue] ở cuối hàng đợi. Các nhà phát triển nhận huy hiệu và túi swag hội nghị của họ, sau đó thoát khỏi hàng [dequeue] ở phía trước hàng đợi

Một cách khác để ghi nhớ các đặc điểm của cấu trúc dữ liệu hàng đợi là coi nó như một đường ống. Bạn thêm các quả bóng bàn vào một đầu và chúng di chuyển đến đầu kia, nơi bạn loại bỏ chúng. Trong khi các quả bóng nằm trong hàng đợi [một ống kim loại đặc], bạn không thể lấy chúng. Cách duy nhất để tương tác với các quả bóng trong hàng đợi là thêm những quả bóng mới ở phía sau đường ống [enqueue] hoặc loại bỏ chúng ở phía trước [dequeue]

Hàng đợi tương tự như ngăn xếp. Sự khác biệt giữa chúng nằm ở cách loại bỏ các mục. Với hàng đợi, bạn xóa mục được thêm gần đây nhất [FIFO] nhưng với ngăn xếp, bạn xóa mục được thêm gần đây nhất [LIFO]

Về mặt hiệu suất, việc triển khai hàng đợi phù hợp dự kiến ​​sẽ mất O[1] thời gian cho các thao tác chèn và xóa. Đây là hai thao tác chính được thực hiện trên hàng đợi và nếu được triển khai đúng cách, chúng phải nhanh

Hàng đợi có nhiều ứng dụng trong thuật toán và thường giúp giải các bài toán lập lịch và lập trình song song. Thuật toán ngắn và đẹp sử dụng hàng đợi là tìm kiếm theo chiều rộng [BFS] trên cấu trúc dữ liệu dạng cây hoặc biểu đồ

Các thuật toán lập lịch thường sử dụng hàng đợi ưu tiên bên trong. Đây là những hàng đợi chuyên biệt. Thay vì truy xuất phần tử tiếp theo theo thời gian chèn, a truy xuất phần tử có mức độ ưu tiên cao nhất. Mức độ ưu tiên của các phần tử riêng lẻ được quyết định bởi hàng đợi dựa trên thứ tự được áp dụng cho các khóa của chúng

Tuy nhiên, một hàng đợi thông thường sẽ không sắp xếp lại thứ tự các vật phẩm mà nó mang theo. Giống như trong ví dụ về đường ống, bạn lấy ra những gì bạn đã đưa vào và theo đúng thứ tự đó

Python vận chuyển với một số triển khai hàng đợi mà mỗi triển khai có các đặc điểm hơi khác nhau. Hãy xem xét chúng

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
6. Xếp hàng chậm khủng khiếp

Có thể, nhưng điều này không lý tưởng từ góc độ hiệu suất. Danh sách khá chậm cho mục đích này vì việc chèn hoặc xóa một phần tử ngay từ đầu yêu cầu chuyển tất cả các phần tử khác theo từng phần một, yêu cầu thời gian O[n]

Do đó, tôi không khuyên bạn nên sử dụng

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
6 làm hàng đợi tạm thời trong Python trừ khi bạn chỉ xử lý một số lượng nhỏ phần tử

>>>

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
9

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
85. Hàng đợi nhanh và mạnh mẽ

Lớp

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
89 triển khai hàng đợi hai đầu hỗ trợ thêm và xóa các phần tử từ một trong hai đầu trong thời gian O[1] [không phân bổ]. Bởi vì deques hỗ trợ thêm và xóa các phần tử từ một trong hai đầu tốt như nhau, nên chúng có thể phục vụ cả dưới dạng hàng đợi và dưới dạng ngăn xếp

Các đối tượng

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
89 của Python được triển khai dưới dạng danh sách liên kết kép. Điều này mang lại cho chúng hiệu suất tuyệt vời và nhất quán để chèn và xóa các phần tử, nhưng hiệu suất O[n] kém khi truy cập ngẫu nhiên các phần tử ở giữa ngăn xếp

Do đó,

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
85 là lựa chọn mặc định tuyệt vời nếu bạn đang tìm kiếm cấu trúc dữ liệu hàng đợi trong thư viện chuẩn của Python

>>>

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
0

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
13. Khóa ngữ nghĩa cho tính toán song song

Việc triển khai trong thư viện chuẩn Python được đồng bộ hóa và cung cấp ngữ nghĩa khóa để hỗ trợ nhiều nhà sản xuất và người tiêu dùng đồng thời

Mô-đun

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
95 chứa một số lớp khác triển khai hàng đợi nhiều nhà sản xuất, nhiều người tiêu dùng hữu ích cho tính toán song song

Tùy thuộc vào trường hợp sử dụng của bạn, ngữ nghĩa khóa có thể hữu ích hoặc chỉ phát sinh chi phí không cần thiết. Trong trường hợp này, tốt hơn hết bạn nên sử dụng

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
85 làm hàng đợi cho mục đích chung

>>>

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
1

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
17. Hàng đợi công việc được chia sẻ

là một triển khai hàng đợi công việc được chia sẻ cho phép các mục trong hàng đợi được xử lý song song bởi nhiều công nhân đồng thời. Song song hóa dựa trên quy trình phổ biến trong CPython do khóa trình thông dịch toàn cầu [GIL] ngăn chặn một số hình thức thực thi song song trên một quy trình thông dịch viên

Là một triển khai hàng đợi chuyên biệt dùng để chia sẻ dữ liệu giữa các quy trình,

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
17 giúp dễ dàng phân phối công việc trên nhiều quy trình để giải quyết các hạn chế của GIL. Loại hàng đợi này có thể lưu trữ và chuyển bất kỳ đối tượng có thể chọn nào qua các ranh giới quy trình

>>>

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
2

Hàng đợi trong Python. Tóm lược

Python bao gồm một số triển khai hàng đợi như một phần của ngôn ngữ cốt lõi và thư viện chuẩn của nó

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
6 đối tượng có thể được sử dụng làm hàng đợi, nhưng điều này thường không được khuyến nghị do hiệu suất chậm

Nếu bạn không tìm kiếm hỗ trợ xử lý song song, thì triển khai do

>>> import collections
>>> d = collections.OrderedDict[one=1, two=2, three=3]

>>> d
OrderedDict[[['one', 1], ['two', 2], ['three', 3]]]

>>> d["four"] = 4
>>> d
OrderedDict[[['one', 1], ['two', 2],
             ['three', 3], ['four', 4]]]

>>> d.keys[]
odict_keys[['one', 'two', 'three', 'four']]
85 cung cấp là một lựa chọn mặc định tuyệt vời để triển khai cấu trúc dữ liệu hàng đợi FIFO trong Python. Nó cung cấp các đặc điểm hiệu suất mà bạn mong đợi từ việc triển khai hàng đợi tốt và cũng có thể được sử dụng làm ngăn xếp [hàng đợi LIFO]

hàng đợi ưu tiên

A là cấu trúc dữ liệu vùng chứa quản lý một tập hợp các bản ghi với các khóa được sắp xếp theo thứ tự hoàn chỉnh để cung cấp khả năng truy cập nhanh vào bản ghi bằng khóa nhỏ nhất hoặc lớn nhất trong tập hợp

Bạn có thể coi hàng đợi ưu tiên là hàng đợi đã sửa đổi. Thay vì truy xuất phần tử tiếp theo theo thời gian chèn, nó truy xuất phần tử có mức độ ưu tiên cao nhất. Mức độ ưu tiên của các phần tử riêng lẻ được quyết định theo thứ tự áp dụng cho các khóa của chúng

Hàng đợi ưu tiên thường được sử dụng để xử lý các vấn đề lập lịch trình. Ví dụ: bạn có thể sử dụng chúng để ưu tiên cho các nhiệm vụ có mức độ khẩn cấp cao hơn

Hãy nghĩ về công việc của một bộ lập lịch tác vụ hệ điều hành

Lý tưởng nhất là các tác vụ có mức độ ưu tiên cao hơn trên hệ thống [chẳng hạn như chơi trò chơi thời gian thực] nên được ưu tiên hơn các tác vụ có mức độ ưu tiên thấp hơn [chẳng hạn như tải xuống các bản cập nhật ở chế độ nền]. Bằng cách sắp xếp các tác vụ đang chờ xử lý trong hàng đợi ưu tiên sử dụng mức độ khẩn cấp của tác vụ làm chìa khóa, bộ lập lịch tác vụ có thể nhanh chóng chọn các tác vụ có mức độ ưu tiên cao nhất và cho phép chúng chạy trước.

Trong phần này, bạn sẽ thấy một số tùy chọn về cách bạn có thể triển khai hàng đợi ưu tiên trong Python bằng cấu trúc dữ liệu tích hợp hoặc cấu trúc dữ liệu có trong thư viện chuẩn của Python. Mỗi cách triển khai sẽ có những ưu điểm và nhược điểm riêng, nhưng theo tôi, rõ ràng có một cách chiến thắng cho hầu hết các tình huống phổ biến. Hãy cùng tìm hiểu xem đó là cái nào

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
6. Hàng đợi được sắp xếp thủ công

Bạn có thể sử dụng một

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
6 đã sắp xếp để nhanh chóng xác định và xóa phần tử nhỏ nhất hoặc lớn nhất. Nhược điểm là việc chèn các phần tử mới vào danh sách là thao tác O[n] chậm

Mặc dù điểm chèn có thể được tìm thấy trong thời gian O[log n] bằng cách sử dụng trong thư viện chuẩn, điều này luôn bị chi phối bởi bước chèn chậm

Duy trì thứ tự bằng cách thêm vào danh sách và sắp xếp lại cũng mất ít nhất O[n log n] thời gian. Một nhược điểm khác là bạn phải sắp xếp lại danh sách theo cách thủ công khi các phần tử mới được chèn vào. Thật dễ dàng để đưa ra các lỗi bằng cách bỏ lỡ bước này và gánh nặng luôn thuộc về bạn, nhà phát triển

Điều này có nghĩa là danh sách được sắp xếp chỉ phù hợp làm hàng đợi ưu tiên khi sẽ có ít lần chèn

>>>

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
3

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
25. Đống nhị phân dựa trên danh sách

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
25 là một triển khai heap nhị phân thường được hỗ trợ bởi một
>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
6 đơn giản và nó hỗ trợ chèn và trích xuất phần tử nhỏ nhất trong thời gian O[log n]

Mô-đun này là một lựa chọn tốt để triển khai hàng đợi ưu tiên trong Python. Vì

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
25 về mặt kỹ thuật chỉ cung cấp triển khai min-heap, để đảm bảo tính ổn định sắp xếp và các tính năng khác thường được mong đợi từ hàng đợi ưu tiên thực tế

>>>

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
4

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
29. Hàng đợi ưu tiên đẹp

sử dụng

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
25 trong nội bộ và chia sẻ cùng sự phức tạp về thời gian và không gian. Sự khác biệt là
>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
32 được đồng bộ hóa và cung cấp ngữ nghĩa khóa để hỗ trợ nhiều nhà sản xuất và người tiêu dùng đồng thời

Tùy thuộc vào trường hợp sử dụng của bạn, điều này có thể hữu ích hoặc có thể làm chậm chương trình của bạn một chút. Trong mọi trường hợp, bạn có thể thích giao diện dựa trên lớp do

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
32 cung cấp hơn giao diện dựa trên chức năng do
>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
25 cung cấp

>>>

>>> from collections import ChainMap
>>> dict1 = {"one": 1, "two": 2}
>>> dict2 = {"three": 3, "four": 4}
>>> chain = ChainMap[dict1, dict2]

>>> chain
ChainMap[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

>>> # ChainMap searches each collection in the chain
>>> # from left to right until it finds the key [or fails]:
>>> chain["three"]
3
>>> chain["one"]
1
>>> chain["missing"]
Traceback [most recent call last]:
  File "", line 1, in 
KeyError: 'missing'
5

Hàng đợi ưu tiên trong Python. Tóm lược

Python bao gồm một số triển khai hàng đợi ưu tiên sẵn sàng để bạn sử dụng

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
29 nổi bật với giao diện hướng đối tượng đẹp mắt và cái tên nêu rõ mục đích của nó. Nó nên là sự lựa chọn ưa thích của bạn

Nếu bạn muốn tránh chi phí khóa của

>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
29, thì sử dụng trực tiếp mô-đun
>>> from collections import defaultdict
>>> dd = defaultdict[list]

>>> # Accessing a missing key creates it and
>>> # initializes it using the default factory,
>>> # i.e. list[] in this example:
>>> dd["dogs"].append["Rufus"]
>>> dd["dogs"].append["Kathrin"]
>>> dd["dogs"].append["Mr Sniffles"]

>>> dd["dogs"]
['Rufus', 'Kathrin', 'Mr Sniffles']
25 cũng là một lựa chọn tốt

Phần kết luận. Cấu trúc dữ liệu Python

Điều đó kết thúc chuyến tham quan của bạn về các cấu trúc dữ liệu phổ biến trong Python. Với kiến ​​thức bạn có được ở đây, bạn đã sẵn sàng triển khai các cấu trúc dữ liệu hiệu quả phù hợp với thuật toán hoặc trường hợp sử dụng cụ thể của mình

Trong hướng dẫn này, bạn đã học

  • Những kiểu dữ liệu trừu tượng phổ biến nào được tích hợp sẵn trong thư viện chuẩn Python
  • Cách các loại dữ liệu trừu tượng phổ biến nhất ánh xạ tới sơ đồ đặt tên của Python
  • Cách đưa các kiểu dữ liệu trừu tượng vào sử dụng thực tế trong các thuật toán khác nhau

Nếu bạn thích những gì bạn học được trong ví dụ này từ Thủ thuật Python, thì hãy nhớ xem phần còn lại của cuốn sách

Nếu bạn quan tâm đến việc nâng cao kiến ​​thức chung về cấu trúc dữ liệu của mình, thì tôi thực sự khuyên bạn nên dùng Steven S. Hướng dẫn thiết kế thuật toán của Skiena. Nó tạo ra sự cân bằng tuyệt vời giữa việc dạy bạn các cấu trúc dữ liệu cơ bản [và nâng cao hơn] và chỉ cho bạn cách triển khai chúng trong mã của bạn. Cuốn sách của Steve đã giúp ích rất nhiều cho việc viết bài hướng dẫn này

Đánh dấu là đã hoàn thành

Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Ngăn xếp và hàng đợi. Chọn cấu trúc dữ liệu lý tưởng

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Gửi cho tôi thủ thuật Python »

Giới thiệu về Dan Bader

Dan Bader là chủ sở hữu và tổng biên tập của Real Python và là nhà phát triển chính của realpython. nền tảng học tập com. Dan đã viết mã hơn 20 năm và có bằng thạc sĩ về khoa học máy tính

» Thông tin thêm về Đan

Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Aldren

David

Joanna

Gia-cốp

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Chuyên gia Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi

Cấu trúc dữ liệu dễ hay khó?

Cấu trúc dữ liệu. Lớp học của tôi không khó chút nào, rất nhiều cấu trúc trực quan và dễ hiểu mà không cần bất kỳ kiến ​​thức nào ngoài mảng khi tôi bắt đầu khóa học này

Tôi nên học cấu trúc dữ liệu trong C++ hay Python?

Ngôn ngữ tốt nhất để học DSA. Theo một tìm kiếm gần đây trên google thì thấy rằng C++ là ngôn ngữ tốt nhất để cạnh tranh cũng như để giải quyết các bài toán về cấu trúc dữ liệu và thuật toán . C++ có thể dạy cho bạn các kỹ năng quản lý bộ nhớ và hướng dẫn độ phức tạp của thời gian một cách hiệu quả.

Chủ Đề