python:迭代按键sorting的字典

我有一个Python字典

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

我需要迭代这是按键sorting。

我试过这个:

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

但价值从x消失。

我需要迭代这是按键sorting。

我认为lambdas是在这里矫枉过正,试试这个:

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

你需要迭代steps.items() ,因为迭代结束只能返回它的键。

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

迭代已sorting的键:

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

您也可以使用Python的许多SortedDict容器types之一。 这些types自动维护按键顺序sorting的字典。 查看一下纯粹的Python和快速实现的sortedcontainers模块。 有一个性能比较 ,基准其他几个实现对彼此。

在你的情况下,你会使用:

 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 

按键/值/项目的迭代按sorting键顺序自动工作。

就像Zagorulkin Dmitry指出的那样,你不应该把lambda传递给sorting函数。 sortingfunction的默认行为是作用于键。

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

然而,将lambda传递给sorting函数并不是一个较好的小利益操作(即“过度杀伤”),但实际上却是不受欢迎的。 它使得代码的可读性降低,而且速度也变慢,特别是如果要将其应用于非常大的字典或多次拨打电话。 除了使分类目标相对于(键,值)对更加明确之外,使用它是没有好处的。 以下时序显示了在指定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 

根据你的使用情况,这可能是一个select持有已经sorting的字典。 有关详细信息,请参阅python OrderedDict 。 如果你想把键sorting为整数,你必须将它们转换为整数。 最好的时机取决于你的用例。

如果你的键不是整数,但是应该被parsing为整数的string:

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

你可以使用类似于你的解决scheme的东西:

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