Kể từ Python 3.6 , dict tích hợp sẽ được đặt hàng
Tin tốt, vì vậy, trường hợp sử dụng ban đầu của các cặp ánh xạ được lấy từ cơ sở dữ liệu với id chuỗi duy nhất là khóa và giá trị số dưới dạng giá trị thành một lệnh Python v3.6 + tích hợp, giờ đây phải tuân theo thứ tự chèn.
Nếu nói kết quả hai biểu thức bảng cột từ một truy vấn cơ sở dữ liệu như:
SELECT a_key, a_value FROM a_table ORDER BY a_value;
sẽ được lưu trữ trong hai bộ dữ liệu Python, k_seq và v_seq (được căn chỉnh theo chỉ số bằng số và với cùng độ dài của khóa học), sau đó:
k_seq = ('foo', 'bar', 'baz')
v_seq = (0, 1, 42)
ordered_map = dict(zip(k_seq, v_seq))
Cho phép xuất sau như:
for k, v in ordered_map.items():
print(k, v)
mang lại hiệu quả trong trường hợp này (đối với dict tích hợp Python 3.6+ mới!):
foo 0
bar 1
baz 42
trong cùng một thứ tự cho mỗi giá trị của v.
Trường hợp cài đặt Python 3.5 trên máy của tôi hiện tại nó mang lại:
bar 1
foo 0
baz 42
Chi tiết:
Như đề xuất vào năm 2012 bởi Raymond Hettinger (xem thư trên python-dev với chủ đề "Từ điển nhỏ gọn hơn với tốc độ lặp nhanh hơn" ) và bây giờ (năm 2016) đã thông báo trong thư của Victor Stinner gửi python-dev với chủ đề "Python 3.6 dict trở thành nhỏ gọn và có phiên bản riêng tư và các từ khóa được đặt hàng " do việc khắc phục / thực hiện vấn đề 27350 " Dict và ra lệnh " trong Python 3.6, giờ đây chúng ta sẽ có thể sử dụng một lệnh chính tả tích hợp để duy trì trật tự chèn !!
Hy vọng rằng điều này sẽ dẫn đến việc thực hiện OrderedDict lớp mỏng như bước đầu tiên. Như @ JimFasarakis-Hilliard đã chỉ ra, một số trường hợp sử dụng cho loại OrderedDict cũng trong tương lai. Tôi nghĩ rằng cộng đồng Python nói chung sẽ kiểm tra cẩn thận, nếu điều này sẽ đứng trước thử thách của thời gian, và các bước tiếp theo sẽ là gì.
Đã đến lúc suy nghĩ lại về thói quen mã hóa của chúng tôi để không bỏ lỡ các khả năng được mở bằng cách đặt hàng ổn định:
- Đối số từ khóa và
- (trung gian) dict lưu trữ
Việc đầu tiên bởi vì nó dễ dàng gửi đi trong việc thực hiện các chức năng và phương pháp trong một số trường hợp.
Thứ hai vì nó khuyến khích sử dụng dễ dàng hơn dict
như là lưu trữ trung gian trong xử lý đường ống.
Raymond Hettinger vui lòng cung cấp tài liệu giải thích " Công nghệ đằng sau từ điển Python 3.6 " - từ bài thuyết trình của Nhóm Gặp gỡ Python San Francisco 2016-DEC-08.
Và có thể một số trang câu hỏi và câu trả lời được trang trí cao của Stack Overflow sẽ nhận được các biến thể của thông tin này và nhiều câu trả lời chất lượng cao cũng sẽ yêu cầu cập nhật mỗi phiên bản.
Caveat Emptor (nhưng cũng xem bên dưới cập nhật 2017-12-15):
Như @ajcr lưu ý chính xác: "Khía cạnh giữ trật tự của việc triển khai mới này được coi là một chi tiết thực hiện và không nên dựa vào." (từ whatsnew36 ) không chọn nit, nhưng trích dẫn đã bị cắt giảm một chút bi quan ;-). Nó tiếp tục là "(điều này có thể thay đổi trong tương lai, nhưng mong muốn có bản triển khai chính tả mới này bằng ngôn ngữ cho một vài bản phát hành trước khi thay đổi thông số ngôn ngữ để bắt buộc ngữ nghĩa duy trì trật tự cho tất cả các triển khai Python hiện tại và tương lai; giúp duy trì khả năng tương thích ngược với các phiên bản cũ hơn của ngôn ngữ trong đó thứ tự lặp ngẫu nhiên vẫn còn hiệu lực, ví dụ Python 3.5). "
Vì vậy, như trong một số ngôn ngữ của con người (ví dụ tiếng Đức), việc sử dụng định hình ngôn ngữ và ý chí hiện đã được tuyên bố ... trong whatsnew36 .
Cập nhật 2017-12-15:
Trong thư gửi đến danh sách python-dev , Guido van Rossum tuyên bố:
Làm cho nó như vậy. "Dict giữ trật tự chèn" là phán quyết. Cảm ơn!
Vì vậy, hiệu ứng phụ CPython phiên bản 3.6 của thứ tự chèn dict hiện đang trở thành một phần của thông số ngôn ngữ (và không chỉ là một chi tiết triển khai). Chủ đề thư đó cũng nổi lên một số mục tiêu thiết kế khác biệt collections.OrderedDict
như được nhắc nhở bởi Raymond Hettinger trong khi thảo luận.