Подтвердить что ты не робот

Python: итерация по словарю, отсортированная по ключу

У меня есть словарь Python

steps = {1:"value1", 5:"value2", 2:"value3"}

Мне нужно итерации по этому сортированному порядку с помощью ключа.

Я пробовал это:

x = sorted(steps, key=lambda key: steps[key])

но значения исчезли из x.

4b9b3361

Ответ 1

Мне нужно итерации по этому сортированному порядку с помощью ключа.

Я думаю, что lambdas здесь слишком много, попробуйте следующее:

>>> steps = {1:"val1", 5:"val2", 2:"val3"}
>>>
>>> for key in sorted(steps):
...     print steps[key]
...
val1
val3
val2

Ответ 2

Вам нужно выполнить итерацию по steps.items(), потому что итерация по dict только возвращает свои ключи.

>>> x = sorted(steps.items())
>>> x
[(1, 'value1'), (2, 'value3'), (5, 'value2')]

Итерации по отсортированным клавишам:

>>> for key in sorted(steps):
...     # use steps[keys] to get the value

Ответ 3

Вы также можете использовать один из типов контейнеров SortedDict из Python. Эти типы автоматически поддерживают словарь, отсортированный по ключевым словам. Взгляните на модуль sortedcontainers, который является чисто-Python и fast-as-C-реализациями. Там сравнение производительности, которое сравнивает несколько других реализаций друг против друга.

В этом случае вы должны использовать:

from sortedcontainers import SortedDict
steps = SortedDict({1:"value1", 5:"value2", 2:"value3"})

# Then iterate the items:

for key, value in steps.items():
    print key, value

# Or iterate the values:

for value in steps.values():
    print value

Итерация для ключей/значений/элементов выполняется автоматически по упорядоченному порядку клавиш.

Ответ 4

Как указал Загурулкин Дмитрий, вы не должны передавать лямбду на функцию сортировки. Функция по умолчанию функции сортировки - действовать на клавиши.

steps = {1:"val1", 5:"val2", 2:"val3"}

for key in sorted(steps):
   print steps[key]
...
val1
val3
val2

Однако передача лямбда в функцию сортировки не является лучшей операцией с небольшим преимуществом (т.е. "излишеством" ), но на самом деле она нежелательна. Это делает код менее читаемым, а также медленнее, особенно если вы собираетесь применить его к очень большим словарям или сделать вызов несколько раз. Помимо того, что цель сортировки более явная в отношении пар (ключ, значение), нет никакой пользы от ее использования. Следующие тайминги показывают производительность, которую вы получаете при указании лямбда.

steps = {randint(0, 100000): randint(0, 100000) for _ in range(100000) } # random dict

%%timeit 
sort_list = [value for _, value in sorted(steps.items(), key=lambda item: item[0])]
1 loops, best of 3: 241 ms per loop

%%timeit 
sort_list = [steps[k] for k in sorted(steps, key=lambda k: k)]
1 loops, best of 3: 196 ms per loop

%%timeit
sort_list = [ steps[key] for key in sorted(steps) ]
10 loops, best of 3: 106 ms per loop

Ответ 5

В зависимости от вашего варианта использования, возможно, будет возможность хранить уже упорядоченный словарь. Подробнее см. Pythons OrderedDict. Если вы хотите отсортировать ключи как целочисленные, вам нужно преобразовать их в целые числа. Лучший момент для этого зависит от вашего варианта использования.

Ответ 6

Если ваши ключи не являются целыми числами, но строками, которые должны анализироваться как целые числа:

steps = {'1':'value1', '10': 'value0', '5':'value2', '2':'value3'}

вы можете использовать что-то похожее на свое решение:

for key, value in sorted(steps, key=lambda key: int(key[0])):
    print(key)

1
2
5
10