当前位置: 代码迷 >> python >> 如何按数字顺序按关键字对字典进行排序 Python
  详细解决方案

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

热度:37   发布时间:2023-07-14 08:44:08.0

这是字典的样子:

{'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)但它不起作用。

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

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

由于字典键总是唯一的,调用sorted on docs_info.items() (这是一个元组序列)相当于只按键排序。

请记住,包含数字的字符串排序不直观! 例如, "11""2" "小"2" 如果您需要按数字对它们进行排序,我建议将键int而不是str 例如

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

这当然只是改变您访问字典元素的顺序,这通常就足够了(因为如果您不访问它,它是否已排序有什么关系?)。 如果出于某种原因您需要对 dict 本身进行“排序”,那么您必须使用collections.OrderedDict ,它会记住项目插入其中的顺序 所以你可以先对你的字典进行排序(如上),然后从排序的(键,值)对中创建一个OrderedDict

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

标准 Python 字典是“无序的”。 您可以使用OrderedDict ,查看:

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)])

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

从 PyPI 安装很容易:

pip install sortedcontainers

如果您不能pip install那么只需从复制 sortedlist.py 和 sorteddict.py 文件。 SortedContainers 是用纯 Python 实现的,但它是快速的 C 实现。

一旦安装简单:

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 模块还维护了几种流行实现的。

在 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函数应用于第一个值。 然后将结果用于比较。