如何按数字顺序Python按键对字典进行排序

时间:2014-03-08 04:16:53

标签: python sorting dictionary

这是字典:

{'57481': 50, '57480': 89, '57483': 110, '57482': 18, '57485': 82, '57484': 40}  

我想按数字顺序对字典进行排序,结果应为:

{'57480': 89, '57481': 50, '57482': 18, '57483': 110, '57484': 40, '57485': 82} 

我尝试了sorted(self.docs_info.items),但它不起作用。

4 个答案:

答案 0 :(得分:16)

如果您只需要按键排序,那么您已经95%了。假设您的词典似乎被称为docs_info

for key, value in sorted(docs_info.items()): # Note the () after items!
    print(key, value)

由于字典键始终是唯一的,因此在sorted上调用docs_info.items()(这是一系列元组)相当于仅按键排序。

请记住,包含数字的字符串排序不直观!例如"11"是"较小"比"2"。如果您需要按数字排序,我建议您使用密钥int而不是str; e.g。

int_docs_info = {int(k) : v for k, v in docss_info.items()}

这当然只是改变了访问词典元素的顺序,这通常就足够了(因为如果你没有访问它,那么它是什么意思呢?&#39; s排序?)。如果由于某种原因你需要将字典本身排序为&#34;那么你必须使用collections.OrderedDict,它会记住项目插入其中的顺序< / em>的。因此,您可以先对字典进行排序(如上所述),然后从排序(键,值)对中创建OrderedDict

sorted_docs_info = collections.OrderedDict(sorted(docs_info.items()))

答案 1 :(得分:8)

标准Python dicts是“无序的”。您可以使用OrderedDict,查看docs

from collections import OrderedDict

d = {'57481': 50, '57480': 89, '57483': 110, '57482': 18, '57485': 82, '57484': 40}
OrderedDict(sorted(d.items(), key=lambda t: t[0]))
# OrderedDict([('57480', 89), ('57481', 50), ('57482', 18), ('57483', 110), ('57484', 40), ('57485', 82)])

答案 2 :(得分:5)

如果重复排序元素并将它们插入有序的dict中太慢,请考虑PyPI上的一个已排序的dict实现。 SortedDict数据类型有效地按排序顺序维护其键。 sortedcontainers模块包含一个这样的实现。

从PyPI安装非常简单:

pip install sortedcontainers

如果你不能pip install,那么只需复制open-source repository中的sortedlist.py和sorteddict.py文件。 SortedContainers在纯Python中实现,但是快速实现。

简单安装后:

In [1]: from sortedcontainers import SortedDict

In [6]: SortedDict({'57481': 50, '57480': 89, '57483': 110, '57482': 18, '57485': 82, '57484': 40})
Out[6]: SortedDict({'57480': 89, '57481': 50, '57482': 18, '57483': 110, '57484': 40, '57485': 82})

sortedcontainers模块还维护了几个流行实现的performance comparison

答案 3 :(得分:3)

在Python 3中,sorted()具有可选参数key。在3.6+版本中,dict保持插入顺序。

key指定一个参数的功能,该参数用于从iterable(例如,key=str.lower)中的每个元素中提取比较关键字。默认值为None(直接比较元素)。

因此,OP所需的功能可以通过这种方式完成。

>>> d = {'57481': 50, '57480': 89, '57483': 110, '57482': 18, '57485': 82, '57484': 40}
>>> for key, value in sorted(d.items(), key=lambda item: int(item[0])):
...     print(key, value)
57480 89
57481 50
57482 18
57483 110
57484 40
57485 82

或者OP要创建新的排序字典。

>>> d = {'57481': 50, '57480': 89, '57483': 110, '57482': 18, '57485': 82, '57484': 40}
>>> d_sorted = {key:value for key, value in sorted(d.items(), key=lambda item: int(item[0]))}
>>> d_sorted
{'57480': 89, '57481': 50, '57482': 18, '57483': 110, '57484': 40, '57485': 82}

d.items()返回一个元组列表,例如('57480': 89),依此类推。 lambda函数采用此元组,并将int函数应用于第一个值。然后将结果用于比较。