2010-05-20 40 views
16

Tôi có một danh sách các từ điển:Sắp xếp một danh sách các dicts bởi dict giá trị

[{'title':'New York Times', 'title_url':'New_York_Times','id':4}, 
{'title':'USA Today','title_url':'USA_Today','id':6}, 
{'title':'Apple News','title_url':'Apple_News','id':2}] 

Tôi muốn sắp xếp nó bằng danh hiệu, vì vậy yếu tố với A đi trước Z:

[{'title':'Apple News','title_url':'Apple_News','id':2}, 
{'title':'New York Times', 'title_url':'New_York_Times','id':4}, 
{'title':'USA Today','title_url':'USA_Today','id':6}] 

Cách tốt nhất để làm điều này là gì? Ngoài ra, có cách nào để đảm bảo thứ tự của mỗi khóa từ điển không đổi, ví dụ: luôn là tiêu đề, title_url, sau đó là id?

+0

Tôi có thể hỏi tại sao bạn cần một dict được sắp xếp? Thông thường bạn đang truy cập một dict thông qua các phím anyway, do đó, thứ tự không quan trọng. –

+3

Er, đó là danh sách các dicts Felix. – Amber

+0

@Amber: Vâng tôi hiểu ... nhưng dù sao câu hỏi thứ hai của anh ta nhắm vào điều này;) –

Trả lời

2

Gọi .sort(fn) trong danh sách, trong đó fn là hàm so sánh giá trị tiêu đề và trả về kết quả của so sánh.

mylist.sort(lambda x,y: cmp(x['title'], y['title'])) 

Trong các phiên bản sau này của Python, mặc dù (2.4+), nó là tốt hơn để chỉ cần sử dụng một chìa khóa loại:

mylist.sort(key=lambda x:x['title']) 

Ngoài ra, từ điển được đảm bảo để giữ gìn trật tự của họ, là bạn lặp thông qua các khóa/giá trị, miễn là không có thêm/xóa thêm. Tuy nhiên, nếu bạn thêm hoặc xóa các mục, tất cả các phiên cược sẽ bị tắt, sẽ không có sự đảm bảo nào cho điều đó.

-1
originalList.sort(lambda d1, d2: cmp(d1['title'], d2['title'])) 

Mặc dù điều này chỉ sắp xếp theo tiêu đề và thứ tự sau đó không được xác định. Làm nhiều cấp độ sẽ gây đau đớn theo cách này.

+2

'cmp' không được chấp nhận vì lý do chính đáng như 'khóa' là tốt hơn nhiều. Sắp xếp trên nhiều cấp độ rất dễ dàng - chỉ cần sử dụng các bộ đếm xem câu trả lời của Kenny –

+1

Thứ tự sau đó được định nghĩa là thứ tự mà chúng đã xuất hiện lần đầu. (Các kiểu Python ổn định.) –

17
l.sort(key=lambda x:x['title']) 

Để sắp xếp với nhiều phím, giả sử tất cả các thứ tự tăng dần:

l.sort(key=lambda x:(x['title'], x['title_url'], x['id'])) 
+2

+1, bằng cách sử dụng 'khóa' và kéo thuộc tính thích hợp là chính xác hơn/sạch hơn là chỉ sử dụng' lambda' làm hàm sắp xếp –

+2

Vâng, tôi cũng nhớ điều đó - Python 2.4+ có chúng, vì vậy chúng có thể có sẵn. – Amber

19

Giải pháp thay thế ít gây dị ứng đối với những người hắt hơi khi tiếp cận bởi lambdas:

import operator 
L.sort(key=operator.itemgetter('title','title_url','id')) 
Các vấn đề liên quan