2009-04-05 33 views
6

Tôi đã thấy (và viết) một số triển khai thực hiện điều này. Có cái nào được coi là tốt nhất hay đang nổi lên như một tiêu chuẩn?Cài đặt dict được sắp xếp tốt nhất trong python là gì?

Điều tôi ngụ ý bởi lệnh dict là đối tượng có một số khái niệm về thứ tự của các khóa trong đó, tương tự như một mảng trong PHP.

odict từ PEP 372 có vẻ giống như một ứng cử viên mạnh mẽ, nhưng nó không hoàn toàn rõ ràng rằng nó là người chiến thắng.

+2

-1: "Tốt nhất" chưa được xác định. –

Trả lời

8

Tôi chưa thấy tiêu chuẩn; tất cả mọi người dường như cuộn của riêng mình (xem câu trả lời cho this question). Nếu bạn có thể sử dụng số OrderedDictpatch từ PEP 372, đó là đặt cược tốt nhất của bạn. Bất cứ thứ gì có trong stdlib đều có khả năng rất cao là những gì mọi người sử dụng một hoặc hai năm kể từ bây giờ.

12

này từng Raymond hettinger là một thả trong thay thế cho collections.OrderedDict sẽ xuất hiện trong Python 2.7: http://pypi.python.org/pypi/ordereddict

Phiên bản dev của các bộ sưu tập tài liệu nói rằng nó tương đương với những gì sẽ là bằng Python 2.7, do đó, có lẽ nó khá có khả năng là một chuyển đổi suôn sẻ đến một trong đó sẽ đi kèm với Python.

Tôi đã đặt nó trong PyPI, vì vậy bạn có thể cài đặt nó với easy_install ordereddict, và sử dụng nó như vậy:

from ordereddict import OrderedDict 
d = OrderedDict([("one", 1), ("two", 2)]) 
+0

lệnh của Raymond Hettinger trông ngắn hơn và thanh lịch hơn so với collection.OrderedDict. Tôi đã suy nghĩ những gì trong collection.OrderedDict là tốt hơn so với Raymond. Làm thế nào đến một trong các gói tiêu chuẩn không phải là tốt như khác? – FrostNovaZzz

+0

@FrostNovaZzz collections.OrderedDict đã được sử dụng nhiều hơn bây giờ, vì vậy tôi mong đợi sự khác biệt "không phù hợp" thực sự là sửa lỗi. – shoyer

1

Python 2.7 và sau đó có OrderedDict trong module collections, vì vậy bạn nên cân nhắc rằng khi 'Tiêu chuẩn'. Nếu chức năng của nó là đủ, có lẽ bạn nên sử dụng nó. Tuy nhiên cách tiếp cận thực hiện của nó là tối giản và nếu đó là không đủ, bạn nên xem odict bởi Foord/Larossa hoặc ordereddict (bởi tôi) như trong trường hợp đó là những người phù hợp hơn. Cả hai triển khai đều là một phần phụ của chức năng được cung cấp bởi collections.OrderedDict. Sự khác biệt giữa hai bản sao, rằng odict là trăn thuần túy và ordereddict mô-đun mở rộng nhanh hơn nhiều C.

Cách tiếp cận tối giản không nhất thiết phải tốt hơn ngay cả khi nó cung cấp tất cả các chức năng bạn cần: ví dụ: collections.OrderedDict ban đầu có một số bug khi trả lại repr() của một số OrderedDict được lồng trong một trong các giá trị của riêng nó. Một lỗi có thể đã được tìm thấy trước đó, có tập hợp con, tập hợp con nhỏ mà OrderedDict có thể xử lý, của các phần tử unittests cũ hơn ordereddict đã được sử dụng.

+0

cảm ơn vì công việc của bạn, Anthon! Tôi đã cố gắng để có được lệnh của bạn, nhưng cả zip và tar lưu trữ trên trang web của bạn đã chết. Ngoài ra, tôi hơi lo lắng là dự án này vẫn còn sống? Ý tôi là, nó sẽ được cập nhật với Python trong tương lai? Ngoài ra, có lẽ, đặt nó trên pip có thể làm cho nó phổ biến hơn?Tôi thấy 7 lần tăng tốc trên trang web của bạn, không chắc tại sao các nhà phát triển Python không chọn triển khai này làm mặc định của con trăn. – jichi

+0

@jichi Tôi đang trong quá trình di chuyển 'orderdict' sang [bitbucket] (https://bitbucket.org/ruamel/ordereddict) và làm cho nó có thể cài đặt với' pip'. Sau khi hoàn thành, tôi cũng sẽ xem xét khả năng tương thích Python 3.X (có thể dựa trên một phiên bản bị tước bỏ, với chức năng giống như collections.OrderedDict). Các liên kết trên trang web sẽ hoạt động trở lại. – Anthon

+0

tuyệt vời, các liên kết hoạt động ngay bây giờ. Cám ơn việc làm của bạn! – jichi

2

collections.OrderedDict hiện nên có sẵn rộng rãi, nhưng nếu hiệu suất là mối quan tâm, bạn có thể xem xét sử dụng gói của tôi cyordereddict làm phương án thay thế. Đó là một cổng trực tiếp của OrderedDict của thư viện chuẩn cho Cython nhanh hơn 2-6 lần.

Các vấn đề liên quan