python:迭代按键排序的字典

时间:2013-05-23 09:23:13

标签: python sorting dictionary

我有一个Python词典

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

我需要通过密钥迭代这个排序顺序。

我试过了:

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

但值已从x。

消失

6 个答案:

答案 0 :(得分:82)

  

我需要通过密钥迭代这个排序顺序。

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

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

答案 1 :(得分:12)

你需要迭代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

答案 2 :(得分:6)

您还可以使用Python的许多SortedDict容器类型之一。这些类型自动维护按键顺序排序的字典。看看sortedcontainers模块,它是纯Python和快速C实现。有一个performance comparison可以对其他几个实现进行基准测试。

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

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

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

答案 3 :(得分:1)

与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

答案 4 :(得分:1)

如果您的键不是整数,而是应该解析为整数的字符串:

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

答案 5 :(得分:0)

根据您的使用情况,可能是保留已经排序的字典的选项。有关详细信息,请参阅pythons OrderedDict。如果要将键排序为整数,则必须将它们转换为整数。这样做的最佳时机取决于您的使用案例。