2012-02-27 41 views
10

thể trùng lặp:
Python: Sort a dictionary by valueSắp xếp dict bởi giá trị và lợi nhuận dict, không danh sách các hàng

d = {"a":4, "b":12, "c":2} 

Nếu tôi sử dụng được sắp xếp() với lambda:

s = sorted(d.items(), key=lambda(k,v):(v,k)) 

Tôi nhận được một bộ danh sách (khóa, giá trị) nhưng tôi muốn lại một lần nữa:

{"c":2, "a":4, "b":12} 

Và làm dict(the_list_of_tuples) bạn trở lại hình vuông.

+0

Bạn đang thực sự ** cố gắng làm gì? –

Trả lời

1

Điều này là không thể. Bạn chỉ có thể có được một đại diện được sắp xếp của một dict như bạn đang nhận được.


Sửa

Chỉ cần làm một số nghiên cứu. Có vẻ như Python 2.7 có thứ gọi là OrderedDict, cho phép bạn làm điều này. Dưới đây là thông tin thêm về nó: http://docs.python.org/library/collections.html?highlight=ordereddict#ordereddict-examples-and-recipes

+0

Ah tôi hiểu rồi, tôi mới đi trước thời điểm đó: D quá tệ Tôi đang sử dụng 2,5 vì lý do lưu trữ. Thay vào đó, tôi sẽ thay đổi mã của mình để chấp nhận danh sách. – ofko

8

Đối tượng tiêu chuẩn dict không được sắp xếp và do đó không đảm bảo hoặc giữ gìn trật tự. Điều này là bởi vì vì bạn thường sử dụng một dict bằng cách lấy một giá trị cho một thứ tự khóa là không quan trọng.

Nếu bạn muốn giữ gìn trật tự, bạn có thể sử dụng an OrderedDict. Điều này không được sắp xếp nhưng không nhớ thứ tự các mục được thêm vào nó. Vì vậy, bạn có thể tạo một trang bằng cặp giá trị quan trọng của bạn trong thứ tự sắp xếp:

>>> d = {"a":4, "b":12, "c":2} 
>>> from collections import OrderedDict 
>>> od = OrderedDict(sorted(d.items(), key=lambda(k,v):(v,k))) 
>>> od 
OrderedDict([('c', 2), ('a', 4), ('b', 12)]) 
1

Như nhiều người khác chỉ ra bạn có thể không phải là trăn không cho phép bạn làm như vậy (trừ trường hợp dicts ra lệnh). Những gì bạn có thể thực hiện dù sao đi nữa là một cái gì đó như thế (python < 2,7)

>>> d = {"a":4, "b":12, "c":2} 
>>> z = [(i,d[i]) for i in d] 
>>> z.sort(key=lambda x: x[1]) 
>>> z 
[('c', 2), ('a', 4), ('b', 12)] 

Và như bây giờ d được sắp xếp, bạn có thể thực hiện tìm kiếm nhị phân trên nó để có được những gì bạn muốn (hoặc một sự lặp lại bình thường nếu bạn don' t quá nhiều về tốc độ).

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