Как и все остальные, словари имеют собственный порядок, и вы не можете просто отсортировать их, как список.
Я хотел бы добавить одну вещь: если вы просто хотите просмотреть элементы словаря в отсортированном порядке, это просто:
for k in sorted(a):
print k, a[k] # or whatever.
Если вы предпочли бы понимание списка (за Алекса):
sortedlist = [(k, a[k]) for k in sorted(a)]
Я хотел бы отметить, что использование Алексом key=int
не будет работать с вашим примером, потому что один из ваших ключей - 'test'
. Если вы действительно хотите, чтобы числа сортировались перед нечисловыми значениями, вам нужно будет передать функцию 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.
Или, может быть, вы достаточно знаете о своих ключах, чтобы написать функцию для преобразования их в строку (или другой объект), которая сортирует прямо:
# 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.
Это было бы намного быстрее, чем использование функции cmp
.