2014-05-10 40 views
6

Giả sử tôi có một đối tượng collections.OrderedDict và một danh sách sắp xếp lại các phím của nó:Cách sắp xếp OrderedDict bằng cách sử dụng danh sách các khóa được sắp xếp?

ordereddict = collections.OrderedDict((
    ('key_78', 'value'), 
    ('key_40', 'value'), 
    ('key_96', 'value'), 
    ('key_53', 'value'), 
    ('key_04', 'value'), 
    ('key_89', 'value'), 
    ('key_52', 'value'), 
    ('key_86', 'value'), 
    ('key_16', 'value'), 
    ('key_63', 'value'), 
)) 

# Example only; actual list will **not** == sorted(ordereddict) 
key_list = ['key_04', 'key_16', 'key_40', 'key_52', 'key_53', 'key_63', 'key_78', 'key_86', 'key_89', 'key_96'] 

Làm thế nào tôi có thể sắp xếp các OrderedDict để nó được sắp xếp theo cùng một cách như key_list?

+0

Có bất kỳ lý do gì để tránh tạo một lệnh _new_? Bởi vì điều đó dễ dàng ... – mgilson

+0

tại sao bạn muốn danh sách các phím để sắp xếp các khóa, tại sao không chỉ tự sắp xếp các khóa? –

Trả lời

3

Sử dụng như sau:

def sort_by_list(dict_, list_): 
    for key in list_: 
     dict_.move_to_end(key) 

sort_by_list(ordereddict, key_list) 

chỉ này hoạt động nếu list_ chứa tất cả các phím trong dict, và trên Python 3.2 hoặc sau đó.

7

Chỉ cần tạo một OrderedDict mới:

newdct = OrderedDict((key, olddct[key]) for key in sortedlist) 

Nếu bạn thực sự cần điều này xảy ra tại chỗ, bạn có thể xóa olddct và cập nhật nó với mới:

olddct.clear() 
olddct.update(newdct) 
+0

Tôi đã thử nghiệm hiệu suất (với 'timeit'), và phương pháp của tôi nhanh hơn 2-4 lần. Ngoài ra, việc sửa đổi dict tại chỗ cũng phù hợp hơn với việc sử dụng nó trong chương trình của tôi. – minerz029

+0

@ minerz029 Phương pháp của bạn đòi hỏi Python 3, mặc dù. – user4815162342

+0

@ user4815162342: Tôi đang sử dụng Python 3.3, nhưng tôi sẽ thêm ghi chú vào câu trả lời của mình. – minerz029

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