Như John Machlin nói rằng bạn không thể thực sự sắp xếp một từ điển Python.
Tuy nhiên, bạn có thể tạo chỉ mục các khóa có thể được sắp xếp theo bất kỳ thứ tự nào bạn muốn.
Mẫu Python ưa thích (thành ngữ) để sắp xếp theo bất kỳ tiêu chí thay thế nào được gọi là "trang trí-sắp xếp-undecorate" (DSU). Trong thành ngữ này, bạn tạo một danh sách tạm thời chứa các bộ dữ liệu chính của bạn, sau đó gọi các phần tử dữ liệu gốc của bạn, sau đó gọi phương thức .sort() trên danh sách đó (hoặc, trong các phiên bản gần đây của Python trang trí trong một được gọi là được sắp xếp() chức năng tích hợp sẵn). Sau đó, bạn xóa "đồ trang trí".
Lý do thường được ưu tiên hơn so với chức năng so sánh truyền sang phương thức .sort() là mã phân loại mặc định được tích hợp sẵn của Python (được biên dịch C trong C Python bình thường) rất nhanh và hiệu quả trong trường hợp mặc định , nhưng nhiều, chậm hơn nhiều khi nó phải gọi mã đối tượng Python nhiều, nhiều lần trong trường hợp không mặc định. Vì vậy, nó thường tốt hơn nhiều để lặp qua dữ liệu tạo cấu trúc dữ liệu mà có thể được chuyển đến các thói quen sắp xếp mặc định.
Trong trường hợp này bạn sẽ có thể sử dụng một cái gì đó như:
[y[1] for y in sorted([(myDict[x][2], x) for x in myDict.keys()])]
... đó là một sự hiểu biết danh sách làm undecorate từ danh sách được sắp xếp của các bộ hiện đang được trả về bởi danh sách hiểu bên trong. Hiểu bên trong là tạo tập hợp các bộ dữ liệu, khóa phân loại mong muốn của bạn (phần tử thứ 3 của danh sách) và khóa của từ điển tương ứng với khóa sắp xếp. myDict.keys() là, tất nhiên, một phương thức từ điển Python trả về một danh sách tất cả các khóa hợp lệ theo thứ tự bất kỳ mà triển khai cơ bản chọn --- có lẽ là một phép lặp đơn giản trên các băm.
Một cách tiết hơn để làm điều này có thể được dễ dàng hơn để đọc:
temp = list()
for k, v in myDict.items():
temp.append((v[2],))
temp.sort()
results = list()
for i in temp:
results.append(i[1])
Thông thường, bạn nên xây dựng mã như vậy lặp đi lặp lại, trong phiên dịch sử dụng các mẫu dữ liệu nhỏ. Xây dựng biểu thức hoặc chức năng "trang trí". Sau đó, bọc trong cuộc gọi tới được sắp xếp(). Sau đó, xây dựng biểu thức undecorate (thường đơn giản như những gì tôi đã hiển thị ở đây).
Ngay sau khi tôi hỏi câu hỏi tôi đã có một hiển linh và về cơ bản đã đưa ra cùng một điều ngoại trừ lambda (chưa biết về chúng). Chỉ cần viết chức năng cmp của riêng tôi có trong tupples từ dict.items() và trả về kết quả. Điều tương tự, chỉ là một cách khác để viết nó. Cảm ơn nhiều vì đã trả lời nhanh! – jay
Giải pháp tuyệt vời. Tôi yêu sự đơn giản của 'được sắp xếp()'. –
Tôi nghĩ rằng nó là một chút rõ ràng hơn theo cách này: sắp xếp (myDict.items(), key = lambda (k, v): v [2]) –