Giống như mọi người khác đã chỉ ra, từ điển có đặt hàng riêng của họ và bạn có thể không chỉ sắp xếp chúng như bạn sẽ một danh sách.
Một điều tôi muốn nói thêm là, nếu bạn chỉ muốn đi qua các yếu tố của một cuốn từ điển theo thứ tự sắp xếp, đó chỉ là:
for k in sorted(a):
print k, a[k] # or whatever.
Nếu bạn muốn có một danh sách hiểu (mỗi Alex):
sortedlist = [(k, a[k]) for k in sorted(a)]
tôi muốn chỉ ra rằng việc sử dụng key=int
Alex sẽ không làm việc với ví dụ của bạn bởi vì một trong những chìa khóa của bạn là 'test'
. Nếu bạn thực sự muốn anh số được sắp xếp trước khi phi numerics, bạn sẽ phải vượt qua trong một hàm cmp
:
def _compare_keys(x, y):
try:
x = int(x)
except ValueError:
xint = False
else:
xint = True
try:
y = int(y)
except ValueError:
if xint:
return -1
return cmp(x.lower(), y.lower())
# or cmp(x, y) if you want case sensitivity.
else:
if xint:
return cmp(x, y)
return 1
for k in sorted(a, cmp=_compare_keys):
print k, a[k] # or whatever.
Hoặc có thể bạn biết đủ về phím của bạn để viết một chức năng để chuyển đổi chúng thành một chuỗi (hoặc đối tượng khác) sắp xếp đúng:
# Won't work for integers with more than this many digits, or negative integers.
MAX_DIGITS = 10
def _keyify(x):
try:
xi = int(x)
except ValueError:
return 'S{0}'.format(x)
else:
return 'I{0:0{1}}'.format(xi, MAX_DIGITS)
for k in sorted(a, key=_keyify):
print k, a[k] # or whatever.
Điều này sẽ nhanh hơn nhiều so với sử dụng chức năng cmp
.
Tôi không thực sự thích điều này nhiều như các giải pháp khác. '_keyify' là không cần thiết cứng nhắc và tôi không nghĩ rằng khá sạch sẽ như một số giải pháp khác và' _compare_keys' của bạn sử dụng 'cmp', mà thường là một dấu hiệu xấu. (Nó cũng là hình thức tốt để giữ cho các khối 'try' cho' try'/'except' càng nhỏ càng tốt. Tôi sẽ đặt' return 'I {0: 0 {1}}' dạng (xi, MAX_DIGITS) 'trong một 'else' block.) –
Không, các giải pháp không được tối ưu hóa, chúng chỉ có các ví dụ hoặc điểm bắt đầu. (Thật khó để đề xuất một giải pháp tốt hơn mà không biết tên miền chính thực sự là gì.) Tôi thích giải pháp của bạn ngoại trừ phần mà nó bị hỏng trong Python 3. Ban đầu tôi viết '_compare_keys' với hai khối' try' hai dòng, nhưng nó dài gấp đôi. Sử dụng các khối 'try' để kiểm soát luồng thực thi đã loại bỏ sự cần thiết của một boolean' yint'. –
Tôi giả định rằng bạn có nghĩa là sử dụng tham số 'cmp', trái ngược với hàm, là một" dấu hiệu xấu ", và có nó là, nhưng nó được đưa vào bởi miền khóa không được xác định đầy đủ. Đó là lý do tại sao tôi tiếp tục với giải pháp '_keyify'. Thậm chí tốt hơn là tạo một lớp mới cho các khóa có thể lấy đầu vào chuỗi và sắp xếp chính xác, và sử dụng nó làm khóa của từ điển thay vào đó, nhưng tôi không biết liệu ben có kiểm soát nhiều hơn từ điển đầu vào hay không. Và, vâng, tôi quên mất 'khối khác'; quá nhiều C++ gần đây. Đã sửa. –