@Smeilz1
За любое развитие

Как сделать сортировку словаря с двузначными ключами?

d ={'1' : '2','11' : ['a','b'],'3' : '1'}
for k in sorted(d.keys()):
    print(k, ':', d[k])

Данный код сортирует ключи так :1,11,3
А как можно сделать сортировку где двузначные или трехзначные числа будут идти по возрастанию?
Насколько я понял это происходит из-за того, что ключи в формате str, тогда нужно перевести все числа в формат int, а если среди ключей будут буквы, тогда возникнет ошибка при конвертации.
  • Вопрос задан
  • 275 просмотров
Решения вопроса 1
adugin
@adugin Куратор тега Python
Преобразование ключенй:
d = dict((int(k), v) if k.isdigit() else (k, v) for (k, v) in d.items())

Немного более быстрый способ:
def convert(item):
    try:
        return int(item)
    except ValueError:
        return item
    
d = dict(zip(map(convert, d.keys()), d.values()))

Ещё про сортировку ключей посмотрите мой ответ здесь.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
aRegius
@aRegius
Python Enthusiast
Если в словаре ключи только строковые числа, можно сортировать просто по int :
>>> d = {'1': 'x', '11': 'x1', '3': 'x2', '101': 'x8'}
# исходный
>>> sorted(d)
['1', '101', '11', '3']
# сортируем по int
>>> sorted(d, key=int)
['1', '3', '11', '101']

а если среди ключей будут буквы, тогда возникнет ошибка при конвертации

Если в словаре есть и обычные строковые ключи, можно сортировать по своей функции:
>>> d = {'zor': 5, 'ert': 5, 'd': 6, 'a': 8, 'zab': 9, '1': 'x', '11': 'x1', '3': 'x2', '101': 'x8'}
# исходный
>>> sorted(d)
['1', '101', '11', '3', 'a', 'd', 'ert', 'zab', 'zor']
# пишем функцию
>>> def d_sort(i):
	      return int(i) if i.isdigit() else False, i
# сортируем
>>> sorted(d, key=lambda x: d_sort(x))
['a', 'd', 'ert', 'zab', 'zor', '1', '3', '11', '101']


P.S. Ну и в конструкции for k in sorted(d.keys()) явное обращение к ключам .keys()
можно не делать, Python пройдет по ключам по умолчанию: for k in sorted(d)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы