Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:遍历按键排序的字典_Python_Sorting_Dictionary - Fatal编程技术网

python:遍历按键排序的字典

python:遍历按键排序的字典,python,sorting,dictionary,Python,Sorting,Dictionary,我有一本Python字典 steps = {1:"value1", 5:"value2", 2:"value3"} 我需要迭代这个按键排序的函数 我试过这个: x = sorted(steps, key=lambda key: steps[key]) 但是这些值已经从x中消失了。您需要迭代steps.items(),因为对dict的迭代只返回其键 >>> x = sorted(steps.items()) >

我有一本Python字典

steps = {1:"value1", 5:"value2", 2:"value3"}
我需要迭代这个按键排序的函数

我试过这个:

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

但是这些值已经从x中消失了。

您需要迭代
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
我需要迭代,这是按键排序的

我认为
lambdas
在这里太过分了,试试这个:

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

根据您的用例,它可能是一个保存已排序字典的选项。有关详细信息,请参见蟒蛇。如果要将键排序为整数,则必须将它们转换为整数。这样做的最佳时机取决于您的用例。

您还可以使用Python的多种SortedAct容器类型之一。这些类型自动维护按键顺序排序的词典。看看这个模块,它是纯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

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

就像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

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

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

那么,我该如何迭代它,比如一个iteritems或其他什么呢?@user984003你不能对dict排序,你只能得到一个排序键、值或项的列表。@AshwiniChaudhary你根本不需要
对于
排序
来说,字典键是唯一的,所以
排序(steps.items())
很好,如果键是字符串,但我需要将其排序为int怎么办?
排序(步骤)
排序(步骤.键())
好。我知道这是一篇非常古老的文章,但我在搜索其他内容时遇到了这个问题,我想注意:
对于键,排序(步骤)中的值:打印值
明显快于
中的键排序(步骤):打印步骤[key]
@DaveLeBlanc:对于答案中定义的步骤
中的键,值排序(步骤):打印值
给出
类型错误:“int”对象不可编辑
-您的意思是
对于键,值排序(步骤.iteritems()):打印值
?Python3:
对于键,按排序的值(steps.items()):