У меня есть словарь Python
steps = {1:"value1", 5:"value2", 2:"value3"}
Мне нужно итерации по этому сортированному порядку с помощью ключа.
Я пробовал это:
x = sorted(steps, key=lambda key: steps[key])
но значения исчезли из x.
У меня есть словарь Python
steps = {1:"value1", 5:"value2", 2:"value3"}
Мне нужно итерации по этому сортированному порядку с помощью ключа.
Я пробовал это:
x = sorted(steps, key=lambda key: steps[key])
но значения исчезли из x.
Мне нужно итерации по этому сортированному порядку с помощью ключа.
Я думаю, что lambdas
здесь слишком много, попробуйте следующее:
>>> steps = {1:"val1", 5:"val2", 2:"val3"}
>>>
>>> for key in sorted(steps):
... print steps[key]
...
val1
val3
val2
Вам нужно выполнить итерацию по 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
Вы также можете использовать один из типов контейнеров 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
Итерация для ключей/значений/элементов выполняется автоматически по упорядоченному порядку клавиш.
Как указал Загурулкин Дмитрий, вы не должны передавать лямбду на функцию сортировки. Функция по умолчанию функции сортировки - действовать на клавиши.
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
В зависимости от вашего варианта использования, возможно, будет возможность хранить уже упорядоченный словарь. Подробнее см. Pythons OrderedDict. Если вы хотите отсортировать ключи как целочисленные, вам нужно преобразовать их в целые числа. Лучший момент для этого зависит от вашего варианта использования.
Если ваши ключи не являются целыми числами, но строками, которые должны анализироваться как целые числа:
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