我有一本 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
您还可以使用 Python 的许多 SortedDict 容器类型之一。这些类型自动维护按键顺序排序的字典。看看sortedcontainers模块,它是纯 Python 和快速 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':'value1', '10': 'value0', '5':'value2', '2':'value3'}
您可以使用类似于您的解决方案的东西:
for key in sorted(steps, key=lambda key: int(key)):
print(key, steps[key])
1
2
5
10
就像 Zagorulkin Dmitry 指出的那样,您不应该将 lambda 传递给排序函数。排序功能的默认行为是作用于键。
steps = {1:"val1", 5:"val2", 2:"val3"}
for key in sorted(steps):
print steps[key]
...
val1
val3
val2
然而,将 lambda 传递给排序函数并不是一个小好处的更好操作(即“矫枉过正”),但它实际上是不受欢迎的。它使代码的可读性降低并且速度也变慢,特别是如果您要将其应用于非常大的字典或多次调用时。除了在(键,值)对方面使排序目标更明确之外,使用它没有任何好处。以下时间显示了您在指定 lambda 时获得的性能影响。
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
根据您的用例,保存已排序的字典可能是一个选项。有关详细信息,请参阅 python OrderedDict。如果要将键排序为整数,则必须将它们转换为整数。这样做的最佳时机取决于您的用例。