Python Dicts có được đặt hàng ngay bây giờ không?
Đôi khi bạn cần một từ điển Python ghi nhớ thứ tự các mục của nó. Trước đây, bạn chỉ có một công cụ để giải quyết vấn đề cụ thể này. con trăn. Đó là một phân lớp từ điển được thiết kế đặc biệt để ghi nhớ thứ tự của các mục, được xác định bởi thứ tự chèn của các phím Show
Điều này đã thay đổi trong Python 3. 6. Lớp 4 tích hợp hiện cũng sắp xếp các mục của nó. Do đó, nhiều người trong cộng đồng Python hiện đang tự hỏi liệu 3 có còn hữu ích không. Xem xét kỹ hơn về 3 sẽ phát hiện ra rằng lớp này vẫn cung cấp các tính năng có giá trịTrong hướng dẫn này, bạn sẽ học cách
Với kiến thức này, bạn sẽ có thể chọn lớp từ điển phù hợp nhất với nhu cầu của mình khi bạn muốn duy trì thứ tự của các mục Đến cuối hướng dẫn, bạn sẽ thấy một ví dụ về triển khai hàng đợi dựa trên từ điển bằng cách sử dụng 3, điều này sẽ khó khăn hơn nếu bạn sử dụng một đối tượng 4 thông thườngTiền thưởng miễn phí. Nhấp vào đây để nhận Bảng cheat Python và tìm hiểu kiến thức cơ bản về Python 3, như làm việc với các kiểu dữ liệu, từ điển, danh sách và hàm Python Lựa chọn giữa Python 3.5.10 (default, Jan 25 2021, 13:22:52) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from collections import OrderedDict >>> numbers = OrderedDict({"one": 1, "two": 2, "three": 3}) >>> numbers OrderedDict([('one', 1), ('three', 3), ('two', 2)]) 3 và Python 3.5.10 (default, Jan 25 2021, 13:22:52) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from collections import OrderedDict >>> numbers = OrderedDict({"one": 1, "two": 2, "three": 3}) >>> numbers OrderedDict([('one', 1), ('three', 3), ('two', 2)]) 4Trong nhiều năm, Python là cấu trúc dữ liệu không có thứ tự. Các nhà phát triển Python đã quen với thực tế này và họ dựa vào danh sách hoặc các trình tự khác khi họ cần giữ dữ liệu của mình theo thứ tự. Theo thời gian, các nhà phát triển nhận thấy nhu cầu về một loại từ điển mới, loại từ điển sẽ giữ cho các mục của nó được sắp xếp theo thứ tự Trở lại năm 2008, PEP 372 đã giới thiệu ý tưởng thêm một lớp từ điển mới vào. Mục tiêu chính của nó là ghi nhớ thứ tự của các mục như được xác định bởi thứ tự các phím được chèn. Đó là nguồn gốc của 3Các nhà phát triển Python cốt lõi muốn lấp đầy khoảng trống và cung cấp một từ điển có thể duy trì thứ tự của các khóa được chèn. Đến lượt mình, điều đó cho phép triển khai đơn giản hơn các thuật toán cụ thể dựa trên thuộc tính này 3 đã được thêm vào thư viện chuẩn trong Python 3. 1. API của nó về cơ bản giống như 4. Tuy nhiên, 3 lặp lại các khóa và giá trị theo cùng thứ tự mà các khóa đã được chèn. Nếu một mục mới ghi đè lên một mục hiện có, thì thứ tự của các mục sẽ không thay đổi. Nếu một mục bị xóa và được chèn lại, thì mục đó sẽ được chuyển đến cuối từ điểnTrăn 3. 6 giới thiệu một. Việc triển khai mới này thể hiện một chiến thắng lớn về mặt sử dụng bộ nhớ và hiệu quả lặp lại. Ngoài ra, triển khai mới cung cấp một tính năng mới và hơi bất ngờ. Các đối tượng 4 hiện giữ các mục của chúng theo thứ tự mà chúng được giới thiệu. Ban đầu, tính năng này được coi là một chi tiết triển khai và tài liệu khuyên không nên dựa vào nóGhi chú. Trong hướng dẫn này, bạn sẽ tập trung vào việc triển khai 4 và 3 mà CPython cung cấpTheo lời của Raymond Hettinger, nhà phát triển Python cốt lõi và đồng tác giả của 3, lớp được thiết kế đặc biệt để giữ cho các mục của nó được sắp xếp theo thứ tự, trong khi triển khai mới của 4 được thiết kế nhỏ gọn và cung cấp khả năng lặp lại nhanh.
Trong Trăn 3. 7, tính năng sắp xếp theo thứ tự của các đối tượng 4 đã được tuyên bố là một phần chính thức của đặc tả ngôn ngữ Python. Vì vậy, kể từ thời điểm đó, các nhà phát triển có thể dựa vào 4 khi họ cần một từ điển để sắp xếp các mục của nóLúc này, một câu hỏi đặt ra. 3 có còn cần thiết sau khi triển khai 4 mới này không? Tại thời điểm viết bài, một số tính năng của 3 vẫn khiến nó trở nên có giá trị và khác biệt so với một 4 thông thường
Có ít nhất một lý do nữa để tiếp tục sử dụng 3 trong mã của bạn. tương thích ngược. Dựa vào các đối tượng 4 thông thường để duy trì thứ tự các mục sẽ phá vỡ mã của bạn trong môi trường chạy các phiên bản Python cũ hơn 3. 6Thật khó để nói liệu 4 có sớm thay thế hoàn toàn 3 hay không. Ngày nay, 3 vẫn cung cấp các tính năng thú vị và có giá trị mà bạn có thể cân nhắc khi lựa chọn một công cụ cho một công việc nhất địnhLoại bỏ các quảng cáoBắt đầu với Python 3.5.10 (default, Jan 25 2021, 13:22:52) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from collections import OrderedDict >>> numbers = OrderedDict({"one": 1, "two": 2, "three": 3}) >>> numbers OrderedDict([('one', 1), ('three', 3), ('two', 2)]) 3 của Python 3 của Python là một phân lớp 4 duy trì thứ tự các cặp khóa-giá trị, thường được gọi là các mục, được chèn vào từ điển. Khi bạn lặp qua một đối tượng 3, các mục sẽ được duyệt theo thứ tự ban đầu. Nếu bạn cập nhật giá trị của khóa hiện có, thì thứ tự sẽ không thay đổi. Nếu bạn xóa một mục rồi chèn lại thì mục đó sẽ được thêm vào cuối từ điểnLà một phân lớp 4 có nghĩa là nó kế thừa tất cả các phương thức mà một từ điển thông thường cung cấp. 3 cũng có các tính năng bổ sung mà bạn sẽ tìm hiểu trong hướng dẫn này. Tuy nhiên, trong phần này, bạn sẽ tìm hiểu kiến thức cơ bản về cách tạo và sử dụng đối tượng 3 trong mã của mìnhTạo đối tượng Python 3.5.10 (default, Jan 25 2021, 13:22:52) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from collections import OrderedDict >>> numbers = OrderedDict({"one": 1, "two": 2, "three": 3}) >>> numbers OrderedDict([('one', 1), ('three', 3), ('two', 2)]) 3Không giống như 4, 3 không phải là kiểu dựng sẵn, vì vậy bước đầu tiên để tạo đối tượng 3 là nhập lớp từ 46. Có một số cách để tạo từ điển theo thứ tự. Hầu hết chúng đều giống với cách bạn tạo một đối tượng 4 thông thường. Ví dụ: bạn có thể tạo một đối tượng 3 trống bằng cách khởi tạo lớp không có đối số>>> 7Trong trường hợp này, trước tiên bạn nhập 3 từ 46. Sau đó, bạn tạo một từ điển có thứ tự trống bằng cách khởi tạo 3 mà không cung cấp đối số cho hàm tạoBạn có thể thêm các cặp khóa-giá trị vào từ điển bằng cách cung cấp khóa trong ngoặc vuông ( 18) và gán giá trị cho khóa đó. Khi bạn tham khảo 19, bạn sẽ nhận được một cặp khóa-giá trị có thể lặp lại chứa các mục theo cùng thứ tự chúng được chèn vào từ điểnBạn cũng có thể chuyển một lần lặp các mục làm đối số cho hàm tạo của 3>>> 4Khi bạn sử dụng , chẳng hạn như 401 hoặc 402, thứ tự của các mục trong từ điển được sắp xếp kết quả khớp với thứ tự ban đầu của các mục trong chuỗi đầu vào. Nếu bạn sử dụng một 403, như trong ví dụ thứ hai ở trên, thì thứ tự cuối cùng của các mục sẽ không được biết cho đến khi tạo ra 3Nếu bạn sử dụng một từ điển thông thường làm công cụ khởi tạo đối tượng 3 và bạn đang sử dụng Python 3. 6 trở lên, thì bạn sẽ có hành vi sau>>> 0Thứ tự của các mục trong đối tượng 3 khớp với thứ tự trong từ điển gốc. Mặt khác, nếu bạn đang sử dụng phiên bản Python thấp hơn 3. 6, sau đó thứ tự của các mặt hàng là không xác định>>>
Vì từ điển trong Python 3. 5 không nhớ thứ tự các mục của họ, bạn không biết thứ tự trong từ điển được sắp xếp cho đến khi đối tượng được tạo. Từ thời điểm này trở đi, trật tự được duy trì Bạn có thể tạo một từ điển có thứ tự bằng cách chuyển đến hàm tạo của lớp >>> 4Vì , các hàm giữ lại thứ tự của các đối số từ khóa được truyền trong một cuộc gọi. Vì vậy, thứ tự của các mục trong 3 ở trên khớp với thứ tự mà bạn chuyển các đối số từ khóa cho hàm tạo. Trong các phiên bản Python trước đó, thứ tự đó không xác địnhCuối cùng, 3 cũng cung cấp 409, tạo một từ điển mới từ một khóa có thể lặp lại và đặt tất cả các giá trị của nó thành một giá trị chung>>> 1Trong trường hợp này, bạn tạo một từ điển có thứ tự bằng cách sử dụng danh sách các khóa làm điểm bắt đầu. Đối số thứ hai của 409 cung cấp một giá trị duy nhất cho tất cả các mục trong từ điểnLoại bỏ các quảng cáoQuản lý các mục trong một Python 3.5.10 (default, Jan 25 2021, 13:22:52) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from collections import OrderedDict >>> numbers = OrderedDict({"one": 1, "two": 2, "three": 3}) >>> numbers OrderedDict([('one', 1), ('three', 3), ('two', 2)]) 3Vì 3 là một cấu trúc dữ liệu nên bạn có thể thực hiện các thao tác thay đổi trên các phiên bản của nó. Bạn có thể chèn các mục mới, cập nhật và xóa các mục hiện có, v.v. Nếu bạn chèn một mục mới vào một từ điển có thứ tự hiện có, thì mục đó sẽ được thêm vào cuối từ điển>>> 6Mục mới được thêm, 413, được đặt ở cuối từ điển bên dưới, vì vậy thứ tự của các mục hiện có không bị ảnh hưởng và từ điển giữ nguyên thứ tự chènNếu bạn xóa một mục khỏi từ điển đã đặt hàng hiện có và chèn lại mục đó, thì phiên bản mới của mục đó sẽ được đặt ở cuối từ điển >>> 3Nếu bạn xóa mục 414 và chèn một phiên bản mới của cùng một mục, thì mục mới sẽ được thêm vào cuối từ điển cơ bảnNếu bạn chỉ định lại hoặc cập nhật giá trị của cặp khóa-giá trị hiện có trong đối tượng 3, thì khóa sẽ giữ nguyên vị trí của nó nhưng nhận một giá trị mới>>> 6Nếu bạn cập nhật giá trị của một khóa nhất định trong một từ điển đã sắp xếp, thì khóa đó sẽ không được di chuyển mà được gán giá trị mới tại chỗ. Theo cách tương tự, nếu bạn sử dụng 416 để sửa đổi giá trị của cặp khóa-giá trị hiện có, thì từ điển sẽ ghi nhớ vị trí của khóa và gán giá trị được cập nhật cho nóLặp lại trên một Python 3.5.10 (default, Jan 25 2021, 13:22:52) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from collections import OrderedDict >>> numbers = OrderedDict({"one": 1, "two": 2, "three": 3}) >>> numbers OrderedDict([('one', 1), ('three', 3), ('two', 2)]) 3Giống như với các từ điển thông thường, bạn có thể lặp qua một đối tượng 3 bằng một số công cụ và kỹ thuật. Bạn có thể lặp lại trực tiếp các khóa hoặc bạn có thể sử dụng các phương thức từ điển, chẳng hạn như , và>>> 1Vòng lặp 422 đầu tiên lặp trực tiếp trên các khóa của 19. Ba vòng lặp khác sử dụng các phương thức từ điển để lặp lại các mục, khóa và giá trị của 19Lặp lại theo thứ tự đảo ngược với Python 3.5.10 (default, Jan 25 2021, 13:22:52) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from collections import OrderedDict >>> numbers = OrderedDict({"one": 1, "two": 2, "three": 3}) >>> numbers OrderedDict([('one', 1), ('three', 3), ('two', 2)]) 425Một tính năng quan trọng khác mà 3 đã cung cấp kể từ đó là các mục, khóa và giá trị của nó hỗ trợ phép lặp ngược bằng cách sử dụng. Điều này đã được thêm vào từ điển thông thường trong Python 3. 8. Vì vậy, nếu mã của bạn sử dụng nó, thì khả năng tương thích ngược của bạn sẽ bị hạn chế hơn nhiều so với các từ điển thông thườngBạn có thể sử dụng 425 với các mục, khóa và giá trị của đối tượng 3>>> 40Mỗi vòng lặp trong ví dụ này sử dụng 425 để lặp qua các phần tử khác nhau của từ điển đã sắp xếp theo thứ tự ngược lạiTừ điển thông thường cũng hỗ trợ lặp ngược. Tuy nhiên, nếu bạn cố gắng sử dụng 425 với một đối tượng 4 thông thường trong phiên bản Python thấp hơn 3. 8, sau đó bạn nhận được một 433>>> 41Nếu bạn cần lặp lại các mục trong từ điển theo thứ tự ngược lại, thì 3 là một đồng minh tốt. Sử dụng từ điển thông thường làm giảm đáng kể khả năng tương thích ngược của bạn vì tính năng lặp ngược không được thêm vào từ điển thông thường cho đến Python 3. 8Loại bỏ các quảng cáoKhám phá các tính năng độc đáo của Python 3.5.10 (default, Jan 25 2021, 13:22:52) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from collections import OrderedDict >>> numbers = OrderedDict({"one": 1, "two": 2, "three": 3}) >>> numbers OrderedDict([('one', 1), ('three', 3), ('two', 2)]) 3 của PythonKể từ Python 3. 6, các từ điển thông thường đã giữ các mục của chúng theo cùng thứ tự mà chúng được chèn vào từ điển cơ bản. Điều này hạn chế tính hữu ích của 3, như bạn đã thấy cho đến nay. Tuy nhiên, 3 cung cấp một số tính năng độc đáo mà bạn không thể tìm thấy ở đối tượng 4 thông thườngVới một từ điển được sắp xếp, bạn có quyền truy cập vào các phương pháp bổ sung và nâng cao sau
3 và 4 cũng cư xử khác nhau khi chúng được kiểm tra về sự bình đẳng. Cụ thể, khi bạn so sánh các từ điển có thứ tự, thứ tự của các mục rất quan trọng. Đó không phải là trường hợp với từ điển thông thườngCuối cùng, phiên bản 3 cung cấp một thuộc tính có tên mà bạn không thể tìm thấy trong phiên bản từ điển thông thường. Thuộc tính này cho phép bạn thêm các thuộc tính có thể ghi tùy chỉnh vào từ điển đã đặt hàng hiện cóSắp xếp lại các mục với Python 3.5.10 (default, Jan 25 2021, 13:22:52) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from collections import OrderedDict >>> numbers = OrderedDict({"one": 1, "two": 2, "three": 3}) >>> numbers OrderedDict([('one', 1), ('three', 3), ('two', 2)]) 33Một trong những khác biệt đáng chú ý hơn giữa 4 và 3 là cái sau có một phương thức bổ sung gọi là 33. Phương pháp này cho phép bạn di chuyển các mục hiện có đến phần cuối hoặc phần đầu của từ điển cơ bản, vì vậy đây là một công cụ tuyệt vời để sắp xếp lại từ điểnKhi bạn sử dụng 33, bạn có thể cung cấp hai đối số
Dưới đây là ví dụ về cách sử dụng 33 với đối số 451 và dựa vào giá trị mặc định của 454>>> 42Khi bạn gọi 33 với một đối số là 451, bạn di chuyển cặp khóa-giá trị có sẵn đến cuối từ điển. Đó là lý do tại sao 414 hiện đang ở vị trí cuối cùng. Lưu ý rằng các mục còn lại vẫn giữ nguyên thứ tự ban đầuNếu bạn vượt qua 456 đến 454 thì bạn chuyển mục lên đầu>>> 43Trong trường hợp này, bạn di chuyển 414 đến đầu từ điển. Điều này cung cấp một tính năng thú vị và mạnh mẽ. Ví dụ: với 33, bạn có thể sắp xếp từ điển theo thứ tự theo khóa>>> 44Trong ví dụ này, trước tiên bạn tạo một từ điển có thứ tự, 467. Vòng lặp 422 lặp lại các khóa đã sắp xếp của nó và di chuyển mọi mục đến cuối từ điển. Khi vòng lặp kết thúc, từ điển đã đặt hàng của bạn có các mục được sắp xếp theo khóaSắp xếp từ điển theo giá trị sẽ là một bài tập thú vị, vì vậy hãy mở rộng khối bên dưới và thử Tập thể dục. Sắp xếp từ điển theo giá trịHiển thị/Ẩn Sắp xếp từ điển sau theo giá trị >>> 45Là một gợi ý hữu ích để triển khai giải pháp, hãy cân nhắc sử dụng hàm 469Bạn có thể mở rộng khối bên dưới để xem giải pháp khả thi Giải pháp. Sắp xếp từ điển theo giá trịHiển thị/Ẩn Bạn có thể sử dụng hàm 469 để truy xuất giá trị của từng cặp khóa-giá trị trong 467 và sử dụng hàm đó làm đối số 451 cho 473>>> 46Trong mã này, bạn sử dụng hàm 469 trả về giá trị của từng cặp khóa-giá trị trong 467. Lệnh gọi tới 473 sử dụng hàm 469 này để trích xuất khóa so sánh từ mỗi phần tử của đầu vào có thể lặp lại, 478. Sau đó, bạn sử dụng 33 để sắp xếp 467Tuyệt quá. Bây giờ bạn đã biết cách sắp xếp lại thứ tự các từ điển đã đặt hàng của mình bằng cách sử dụng 33. Bạn đã sẵn sàng chuyển sang phần tiếp theoLoại bỏ các quảng cáoXóa các mục bằng Python 3.5.10 (default, Jan 25 2021, 13:22:52) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from collections import OrderedDict >>> numbers = OrderedDict({"one": 1, "two": 2, "three": 3}) >>> numbers OrderedDict([('one', 1), ('three', 3), ('two', 2)]) 34Một tính năng thú vị khác của 3 là phiên bản nâng cao của 34. Theo mặc định, 34 xóa và trả lại một mục theo thứ tự LIFO (Last-In/First-Out). Nói cách khác, nó loại bỏ các mục từ đầu bên phải của từ điển đã sắp xếp>>> 47Tại đây, bạn xóa tất cả các mục khỏi 19 bằng cách sử dụng 34. Mọi cuộc gọi đến phương thức này sẽ xóa một mục duy nhất khỏi phần cuối của từ điển cơ bản. Nếu bạn gọi 34 trên một từ điển trống, thì bạn sẽ nhận được một 453. Cho đến thời điểm này, 34 hoạt động giống như trong các từ điển thông thườngTuy nhiên, trong 3, 34 cũng chấp nhận một đối số Boolean có tên là 454, mặc định là 455. Nếu bạn đặt 454 thành 456, thì 34 sẽ xóa các mục theo thứ tự FIFO (Nhập trước/Xuất trước), có nghĩa là nó xóa các mục khỏi đầu từ điển>>> 48Với 454 được đặt thành 455, bạn có thể sử dụng 34 để xóa và trả lại các mục từ phần đầu của từ điển đã đặt hàng. Trong ví dụ này, lệnh gọi cuối cùng tới ____834 sẽ tăng ____6453 vì từ điển cơ bản đã trốngKiểm tra sự bình đẳng giữa các từ điểnKhi bạn kiểm tra hai đối tượng 3 về sự bằng nhau trong ngữ cảnh Boolean, thứ tự của các mục đóng một vai trò quan trọng. Ví dụ: nếu từ điển được sắp xếp của bạn chứa cùng một bộ mục, thì kết quả kiểm tra phụ thuộc vào thứ tự của chúng>>> 49Trong ví dụ này, 004 có một chút khác biệt về thứ tự các mục của nó so với 005 và 006, vì vậy phép thử đầu tiên trả về 456. Trong bài kiểm tra thứ hai, 005 và 006 có cùng một bộ mục, theo thứ tự giống nhau, vì vậy bài kiểm tra trả về 455Nếu bạn thử ví dụ tương tự này bằng từ điển thông thường, thì bạn sẽ nhận được một kết quả khác >>> 00Tại đây, khi bạn kiểm tra hai từ điển thông thường về sự bằng nhau, bạn nhận được 455 nếu cả hai từ điển có cùng một bộ mục. Trong trường hợp này, thứ tự của các mục không thay đổi kết quả cuối cùngCuối cùng, các bài kiểm tra bằng nhau giữa một đối tượng 3 và một từ điển thông thường không tính đến thứ tự của các mục>>> 01Khi bạn so sánh từ điển có thứ tự với từ điển thông thường, thứ tự của các mục không thành vấn đề. Nếu cả hai từ điển có cùng một bộ mục, thì chúng sẽ so sánh bằng nhau, bất kể thứ tự của các mục của chúng Nối các thuộc tính mới vào một thực thể từ điểnCác đối tượng 3 có thuộc tính 445 mà bạn không thể tìm thấy trong các đối tượng từ điển thông thường. Hãy xem đoạn mã sau>>> 02Trong ví dụ đầu tiên, bạn truy cập thuộc tính 445 trên từ điển có thứ tự 467. Python sử dụng nội bộ thuộc tính này để lưu trữ các thuộc tính thể hiện có thể ghi. Ví dụ thứ hai cho thấy các đối tượng từ điển thông thường không có thuộc tính 445Bạn có thể sử dụng thuộc tính 445 của từ điển đã sắp xếp để lưu trữ các thuộc tính thể hiện có thể ghi được tạo động. có nhiều hướng khác nhau để làm điều đó. Ví dụ: bạn có thể sử dụng bài tập kiểu từ điển, như trong 019. Bạn cũng có thể sử dụng ký hiệu dấu chấm, như trong 020Đây là một ví dụ về việc sử dụng 445 để đính kèm một chức năng mới vào một từ điển được đặt hàng hiện có>>> 03Bây giờ bạn có một hàm 022 469 được đính kèm với từ điển theo thứ tự 467 của bạn. Lưu ý rằng bạn có thể kiểm tra nội dung của 445 bằng cách truy cập trực tiếp vào nội dung đó bằng ký hiệu dấu chấm hoặc bằng cách sử dụngGhi chú. Loại thuộc tính động này được thêm vào một thể hiện cụ thể của một lớp nhất định. Trong ví dụ trên, trường hợp đó là 467. Điều này không ảnh hưởng đến các phiên bản khác cũng như bản thân lớp, vì vậy bạn chỉ có quyền truy cập vào 022 đến 467Bạn có thể sử dụng hàm được thêm động này để lặp qua các khóa từ điển theo thứ tự đã sắp xếp mà không làm thay đổi thứ tự ban đầu trong 467>>> 04Đây chỉ là một ví dụ về mức độ hữu ích của tính năng này của 3. Lưu ý rằng bạn không thể làm điều gì đó tương tự với từ điển thông thường>>> 05Nếu bạn cố gắng tự động thêm các thuộc tính phiên bản tùy chỉnh vào một từ điển thông thường, thì bạn sẽ nhận được thông báo 032 cho biết rằng từ điển cơ bản không có sẵn thuộc tính đó. Đó là bởi vì các từ điển thông thường không có thuộc tính 445 để chứa các thuộc tính thể hiện mớiLoại bỏ các quảng cáoHợp nhất và cập nhật từ điển với toán tửTrăn 3. 9 đã thêm hai toán tử mới vào không gian từ điển. Bây giờ bạn đã hợp nhất ( 034) và cập nhật ( 035) toán tử từ điển. Các toán tử này cũng hoạt động với các phiên bản 3>>> 06Như tên gọi của nó, toán tử hợp nhất hợp nhất hai từ điển thành một từ điển mới chứa các mục của cả hai từ điển ban đầu. Nếu các từ điển trong biểu thức có các khóa chung, thì các giá trị của từ điển ngoài cùng bên phải sẽ chiếm ưu thế Toán tử cập nhật rất hữu ích khi bạn có một từ điển và muốn cập nhật một số giá trị của nó mà không cần gọi 416>>> 07Trong ví dụ này, bạn sử dụng toán tử cập nhật từ điển để cập nhật thông tin. Toán tử cập nhật một từ điển tại chỗ. Nếu từ điển cung cấp dữ liệu cập nhật có khóa mới, thì các khóa đó sẽ được thêm vào cuối từ điển gốc Xem xét hiệu suấtHiệu suất là một chủ đề quan trọng trong lập trình. Biết thuật toán chạy nhanh như thế nào hoặc sử dụng bao nhiêu bộ nhớ là mối quan tâm chung. 3 ban đầu được mã hóa bằng Python và sau đó được viết bằng C để tối đa hóa hiệu quả trong các phương thức và hoạt động của nó. Hai triển khai này hiện có sẵn trong thư viện chuẩn. Tuy nhiên, triển khai Python đóng vai trò thay thế nếu triển khai C không khả dụng vì một số lý doCả hai cách triển khai của 3 đều liên quan đến việc sử dụng a để nắm bắt thứ tự của các mục. Mặc dù có thời gian tuyến tính cho một số thao tác, nhưng việc triển khai danh sách liên kết trong 3 được tối ưu hóa cao để duy trì thời gian nhanh của các phương thức từ điển tương ứng. Điều đó nói rằng, các hoạt động trên một từ điển có thứ tự nhưng với hệ số không đổi lớn hơn so với các từ điển thông thườngNhìn chung, 3 có hiệu năng thấp hơn các từ điển thông thường. Đây là một ví dụ đo thời gian thực hiện của một số thao tác trên cả hai lớp từ điển 08Trong tập lệnh này, bạn tính toán 042 cần để chạy một số thao tác phổ biến trên một từ điển nhất định. Vòng lặp 422 dùng đo thời gian thực hiện của tập hợp các thao tác. Hàm trả về thời gian trung bình, tính bằng nano giây, cần để chạy tập hợp các thao tác đã chọnGhi chú. Nếu bạn muốn biết các cách khác để định thời gian cho mã của mình, thì bạn có thể xem Các hàm hẹn giờ trong Python. Ba cách để theo dõi mã của bạn Nếu bạn chạy tập lệnh này từ dòng lệnh của mình, thì bạn sẽ nhận được kết quả tương tự như thế này 09Như bạn thấy ở đầu ra, thao tác trên đối tượng 4 nhanh hơn thao tác trên đối tượng 3Về mức tiêu thụ bộ nhớ, các phiên bản 3 phải trả phí lưu trữ do danh sách khóa được sắp xếp theo thứ tự của chúng. Đây là một tập lệnh cung cấp cho bạn ý tưởng về chi phí bộ nhớ này>>> 0Trong ví dụ này, bạn sử dụng để đo dung lượng bộ nhớ theo byte của hai đối tượng từ điển. Ở đầu ra, bạn có thể thấy rằng từ điển thông thường chiếm ít bộ nhớ hơn so với đối tác 3 của nóLoại bỏ các quảng cáoChọn từ điển phù hợp cho công việcCho đến giờ, bạn đã biết về sự khác biệt tinh tế giữa 3 và 4. Bạn đã học được điều đó, mặc dù các từ điển thông thường đã được sắp xếp cấu trúc dữ liệu kể từ Python 3. 6, vẫn có một số giá trị khi sử dụng 3 vì một tập hợp các tính năng hữu ích không có trong 4Dưới đây là tóm tắt về những điểm khác biệt và tính năng phù hợp hơn của cả hai loại mà bạn nên cân nhắc khi quyết định sử dụng loại nào Tính năng 3 4Thứ tự chèn khóa được duy trì Có (kể từ Python 3. 1)Có (kể từ Python 3. 6)Khả năng đọc và ý định báo hiệu liên quan đến thứ tự của các mụcCaoThấpKiểm soát thứ tự của các mụcCao ( 33, nâng cao 34)Thấp (cần xóa và chèn lại các mục)Hiệu suất hoạt độngThấpCaoMức tiêu thụ bộ nhớCaoThấpThấpCác kiểm tra chất lượng xem xét thứ tự của các mụcCóKhôngHỗ trợ cho phép lặp ngượcCó (kể từ Python 3). 5) Có (kể từ Python 3. 8) Khả năng nối thêm các thuộc tính phiên bản mới Có (thuộc tính ____6445) Không Hỗ trợ cho các toán tử từ điển hợp nhất (_______7034) và cập nhật ( 035) Có (kể từ Python 3. 9)Có (kể từ Python 3. 9)Bảng này tóm tắt một số điểm khác biệt chính giữa 3 và 4 mà bạn nên cân nhắc khi cần chọn một lớp từ điển để giải quyết vấn đề hoặc thực hiện một thuật toán cụ thể. Nói chung, nếu thứ tự của các mục trong từ điển là quan trọng hoặc thậm chí quan trọng để mã của bạn hoạt động chính xác, thì cái nhìn đầu tiên của bạn nên hướng tới 3Xây dựng hàng đợi dựa trên từ điểnTrường hợp sử dụng mà bạn nên cân nhắc sử dụng đối tượng 3 thay vì đối tượng 4 là khi bạn cần triển khai hàng đợi dựa trên từ điển. Hàng đợi là cấu trúc dữ liệu phổ biến và hữu ích để quản lý các mục của chúng theo cách FIFO. Điều này có nghĩa là bạn đẩy các mục mới vào cuối hàng đợi và các mục cũ bật ra từ đầu hàng đợiThông thường, các hàng đợi thực hiện một thao tác để thêm một mục vào cuối của chúng, thao tác này được gọi là thao tác xếp hàng. Hàng đợi cũng thực hiện một thao tác để loại bỏ các mục từ đầu, được gọi là thao tác xếp hàng Để tạo hàng đợi dựa trên từ điển, hãy kích hoạt trình soạn thảo mã hoặc IDE của bạn, tạo một mô-đun Python mới có tên là 066 và thêm đoạn mã sau vào đó 1Trong 067, trước tiên bạn khởi tạo một tên gọi là 068. Thuộc tính này chứa một từ điển có thứ tự trống mà bạn sẽ sử dụng để lưu trữ dữ liệu. Trình khởi tạo lớp nhận đối số tùy chọn đầu tiên, 069, cho phép bạn cung cấp dữ liệu ban đầu khi bạn khởi tạo lớp. Trình khởi tạo cũng nhận các đối số từ khóa tùy chọn (______7070) để cho phép bạn sử dụng các đối số từ khóa trong hàm tạoSau đó, bạn mã 071, cho phép bạn thêm các cặp khóa-giá trị vào hàng đợi. Trong trường hợp này, bạn sử dụng 33 nếu khóa đã tồn tại và bạn sử dụng phép gán bình thường cho các khóa mới. Lưu ý rằng để phương pháp này hoạt động, bạn cần cung cấp hai mục 402 hoặc 401 với một cặp khóa-giá trị hợp lệViệc triển khai 075 sử dụng 34 với 454 được đặt thành 456 để xóa và trả lại các mục từ đầu từ điển được đặt hàng cơ bản, 068. Trong trường hợp này, bạn sử dụng a để xử lý 453 xảy ra khi bạn gọi 34 trên một từ điển trốngPhương thức đặc biệt cung cấp chức năng cần thiết để truy xuất độ dài của từ điển được đặt hàng nội bộ, 068. Cuối cùng, phương thức đặc biệt cung cấp một biểu diễn chuỗi thân thiện với người dùng của hàng đợi khi bạn in cấu trúc dữ liệu ra màn hìnhDưới đây là một số ví dụ về cách bạn có thể sử dụng 067>>> 2Trong ví dụ mã này, trước tiên bạn tạo ba đối tượng 067 khác nhau bằng các cách tiếp cận khác nhau. Sau đó, bạn sử dụng 071 để thêm một mục vào cuối 090. Cuối cùng, bạn gọi 075 nhiều lần để loại bỏ tất cả các mục trong 090. Lưu ý rằng cuộc gọi cuối cùng tới 075 sẽ in một thông báo ra màn hình để thông báo cho bạn rằng hàng đợi đã trốngSự kết luậnTrong nhiều năm, từ điển Python là cấu trúc dữ liệu không có thứ tự. Điều này cho thấy sự cần thiết của một từ điển được sắp xếp giúp ích trong các tình huống mà thứ tự của các mục là quan trọng. Vì vậy, các nhà phát triển Python đã tạo ra , được thiết kế đặc biệt để sắp xếp các mặt hàng của nó Trăn 3. 6 đã giới thiệu một tính năng mới vào từ điển thông thường. Bây giờ họ cũng nhớ thứ tự của các mặt hàng. Với sự bổ sung này, hầu hết các lập trình viên Python tự hỏi liệu họ có cần cân nhắc sử dụng 3 hay khôngTrong hướng dẫn này, bạn đã học
Bây giờ bạn đang ở một vị trí tốt hơn để đưa ra quyết định sáng suốt về việc nên sử dụng 4 hay 3 nếu mã của bạn cần một từ điển có thứ tựTrong hướng dẫn này, bạn đã mã hóa một ví dụ về cách triển khai hàng đợi dựa trên từ điển, đây là trường hợp sử dụng cho thấy rằng 3 vẫn có thể có giá trị trong cuộc phiêu lưu mã hóa Python hàng ngày của bạnĐánh dấu là đã hoàn thành 🐍 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ề Leodanis Pozo Ramos Leodanis là một kỹ sư công nghiệp yêu thích Python và phát triển phần mềm. Anh ấy là một nhà phát triển Python tự học với hơn 6 năm kinh nghiệm. Anh ấy là một nhà văn đam mê kỹ thuật với số lượng bài báo được xuất bản ngày càng tăng trên Real Python và các trang web khác » Tìm hiểu thêm về LeodanisMỗ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 Bartosz Geir Arne 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 Pythonista chuyên gia Nâng cao kỹ năng Python của bạn » Bậc thầy Kỹ năng Python trong thế giới 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 các chuyên gia Pythonistas 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ẻ EmailBà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ác từ điển Python hiện đã được đặt hàng chưa?Từ điển có thể thay đổi (như danh sách). Từ điển Python không có thứ tự, nhưng bắt đầu với Python 3. 6 chúng hiện đã được sắp xếp theo thứ tự để bạn có thể sắp xếp chúng. Chúng được chèn theo thứ tự. Từ điển nhớ thứ tự các mục được chèn.
Python dict có được sắp xếp theo mặc định không?Chính tả của Python luôn không có thứ tự cho đến Python 3. 6, khi nó được thay đổi thành được đặt hàng dựa trên đề xuất của Raymond Hettinger, một trong những nhà phát triển cốt lõi của Python.
Tại sao từ điển không được đặt hàng Python?Từ điển trong Python là một tập hợp các giá trị dữ liệu không có thứ tự, được sử dụng để lưu trữ các giá trị dữ liệu giống như bản đồ, không giống như các Loại dữ liệu khác chỉ chứa một giá trị dưới dạng phần tử, Từ điển giữ khóa. cặp giá trị. Khóa-giá trị được cung cấp trong từ điển để làm cho nó được tối ưu hóa hơn .
Là từ điển được sắp xếp theo thứ tự hoặc không theo thứ tự?Lưu ý rằng từ điển không có thứ tự , nghĩa là bất cứ khi nào bạn lặp qua một từ điển, bạn sẽ duyệt qua mọi khóa, nhưng bạn thì không . |