2016-01-29 12 views
5

Tôi đã một danh sáchSắp xếp một danh sách các từ điển cung cấp một trật tự

order = [8, 7, 5, 9, 10, 11] 

và một danh sách các từ điển

list_of_dct = [{'value':11}, {'value':8}, {'value':5}, {'value':7}, {'value':10}, {'value':9}] 

Tôi muốn sắp xếp list_of_dct này theo lệnh được đưa ra trong danh sách order, tức là đầu ra phải như sau:

list_of_dct = [{'value':8}, {'value':7}, {'value':5}, {'value':9}, {'value':10}, {'value':11}] 

Tôi biết cách sắp xếp theo key, nhưng không phải khi đã đặt hàng. Làm thế nào tôi có thể sắp xếp nó?

PS: Tôi đã có giải pháp O (n^2). Tìm kiếm một giải pháp tốt hơn.

+1

cố gắng đăng bài ur .. –

+0

Giá trị 'khóa' chính có phải là tĩnh cho tất cả các lệnh chính tả trong danh sách hoặc chỉ là trình giữ chỗ không? Ngoài ra, danh sách 'thứ tự' có chứa tất cả các mục hiện diện trong bản sao chính tả không? –

+1

Thay vì thực hiện sắp xếp chung, sẽ có hiệu quả hơn khi xây dựng một 'dict' chứa các giá trị làm khóa, sau đó chỉ cần trích xuất các mục theo thứ tự từ đó. Câu hỏi: (1) Mọi giá trị trong 'thứ tự' được biết là tồn tại dưới dạng giá trị trong' list_of_dct'? (2) Có thể cùng một giá trị xảy ra nhiều lần trong 'list_of_dct' không? –

Trả lời

5

Sử dụng chỉ số của danh sách order để sắp xếp-Chỉ cần cố gắng nếu mọi từ điển có một giá trị và bạn muốn sắp xếp theo giá trị gia tăng mà

sorted(list_of_dct,key=lambda x:order.index(x.values()[0])) 

Nhưng nếu bạn có nhiều giá trị cho một chìa khóa sau đó thay đổi các chỉ số (tức là [0]) mà bạn sẽ sắp xếp.

3

Thực hiện một bản đồ của 8-0, 7-1, ..., 11-5 sử dụng enumerate:

>>> order = [8,7,5,9,10,11] 
>>> list_of_dct = [{'value':11}, {'value':8}, {'value':5}, 
        {'value':7}, {'value':10}, {'value':9}] 
>>> sort_keys = {item: i for i, item in enumerate(order)} 
>>> sort_keys 
{5: 2, 7: 1, 8: 0, 9: 3, 10: 4, 11: 5} 

Và sử dụng nó như một chìa khóa sắp xếp:

>>> list_of_dct.sort(key=lambda d: sort_keys.get(d['value'], len(sort_keys))) 
>>> list_of_dct 
[{'value': 8}, {'value': 7}, {'value': 5}, {'value': 9}, 
{'value': 10}, {'value': 11}] 

sử dụng sort_keys.get(..) thay vì sort_keys[..] để ngăn chặn KeyError trong trường hợp giá trị bị sai trong order.

+2

Được thăng hạng nó vì tra cứu dict chỉ có độ phức tạp 0 (1). – The6thSense

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