2009-12-09 24 views
17

Fellows:mục từ điển Lưu trữ Python theo thứ tự chúng được đẩy

điển

Một Python được lưu trữ không theo thứ tự đặc biệt (các ánh xạ không có trật tự), ví dụ:

>>> myDict = {'first':'uno','second':'dos','third':'tres'} 
myDict = {'first':'uno','second':'dos','third':'tres'} 
>>> myDict 
myDict 
{'second': 'dos', 'third': 'tres', 'first': 'uno'} 

Mặc dù có thể để lấy một danh sách được sắp xếp hoặc tuple từ một từ điển, tôi tự hỏi nếu nó có thể làm cho một cửa hàng từ điển các mục theo thứ tự chúng được truyền cho nó, trong ví dụ trước đó có nghĩa là có thứ tự nội bộ như {'first':'uno','second':'dos','third':'tres'} và không khác nhau.

Tôi cần điều này vì tôi đang sử dụng từ điển để lưu trữ các giá trị khi tôi đọc chúng từ tệp cấu hình; một khi đã đọc và xử lý (các giá trị được thay đổi), chúng phải được ghi vào một tệp cấu hình mới theo thứ tự như chúng được đọc (thứ tự này không phải là chữ cái hoặc số).

Mọi suy nghĩ?

Sửa: Xin lưu ý rằng tôi không tìm cách học để lấy thứ tự (như danh sách), nhưng cách để làm cho một từ điển được đặt hàng của riêng mình (vì nó sẽ là trong các phiên bản sắp tới của Python) .

+2

http://stackoverflow.com/questions/1867861/python-dictionary-keep-keys-values-in-same-order-as-declared –

+0

@ Ofri Raviv: chính xác cùng một câu hỏi. Cảm ơn. – Escualo

+1

Vì bạn đang cố gắng duy trì trật tự, đây không phải là từ điển. Bạn đang làm quá nhiều thứ. Bạn có thể muốn cả hai từ điển (để lập bản đồ) và danh sách (để giữ lại thứ tự). Không có gì sai với điều đó. –

Trả lời

30

Hãy thử python 2.7 trở lên, có lẽ 3.1, có OrderedDict

http://www.python.org/

http://python.org/download/releases/2.7/

>>> from collections import OrderedDict 
>>> d = OrderedDict([('first', 1), ('second', 2), 
...     ('third', 3)]) 
>>> d.items() 
[('first', 1), ('second', 2), ('third', 3)] 

PEP 372: Adding an ordered dictionary to collections

+0

Nhưng hãy nhớ rằng đây là một tính năng mới của bản phát hành Python sắp tới và không có sẵn trong các phiên bản cũ hơn – akr

+0

... nhưng Tôi bị mắc kẹt với 2.5.1: ( – Escualo

+3

Hoặc lấy mã nguồn của OrderedDict từ bản vá này: http://bugs.python.org/issue5397 –

4

Sử dụng danh sách để giữ thứ tự khóa

+0

nhanh chóng và bẩn. Than ôi, không phải rất nhỏ gọn (có thể bị giòn). –

+0

Tác phẩm này, nhưng tôi đang tìm kiếm một cách "tự nhiên" hơn, nếu có. Dường như OrderedDict được đề xuất bởi S.Mark là giải pháp thay thế mà tôi đang tìm kiếm. Thật không may, tôi bị mắc kẹt với Python 2.5.1 :( – Escualo

+1

Không, nếu bạn đóng gói dict và danh sách trong một đối tượng duy nhất với giao diện dict, mà, bằng cách này, là những gì nhiều thứ tự thực hiện Dict làm (không biết về việc thực hiện thực hiện được sử dụng trong 2.7) –

1

Từ điển trong Python được triển khai dưới dạng bảng băm, đó là lý do tại sao đơn hàng xuất hiện ngẫu nhiên. Bạn có thể thực hiện biến thể của riêng bạn của một dict mà loại, nhưng bạn sẽ mất trên cú pháp thuận tiện. Thay vào đó, hãy theo dõi thứ tự của các phím.

khởi:

keys = [] 
myDict = {} 

Trong khi đọc:

myDict[key] = value 
keys.append(key) 

Trong khi viết:

for key in keys: 
    print key, myDict[key] 
+0

Phím của tôi không theo thứ tự bảng chữ cái hoặc chữ số: (Chúng có thể là bất kỳ thứ gì) – Escualo

+0

Bạn sẽ không cần phải mất bất kỳ cú pháp nào, chỉ cần thực hiện các phương thức đặc biệt như __get __() và __set __() vv Sử dụng cú pháp như dict ['key'] và dict ['key1'] = newvalue. – Isaac

3

Triển khai các từ điển để bảo quản chắc chắn tồn tại.

this one in Django, gây nhầm lẫn được gọi là SortedDict, sẽ hoạt động trong Python> = 2,3 iirc.

+0

Chỉ cần nhận thấy điều này sẽ không được chấp nhận trong Django 1.9. – imns

-2

Có một câu trả lời rất ngắn để mà .. làm điều này--

dictCopy = yourdictname.copy()

sau đó sử dụng dictCopy, nó sẽ được theo thứ tự.

+0

Từ điển trong Python không có thứ tự, do đó câu hỏi. – Escualo

1

Thay vì giải thích phần lý thuyết tôi sẽ đưa ra một ví dụ đơn giản.

>>> from collections import OrderedDict 
>>> my_dictionary=OrderedDict() 
>>> my_dictionary['foo']=3 
>>> my_dictionar['aol']=1 
>>> my_dictionary 
OrderedDict([('foo', 3), ('aol', 1)]) 
Các vấn đề liên quan