【问题标题】:How to sort dictionary by key in numerical order Python如何按数字顺序Python按键对字典进行排序
【发布时间】:2014-04-11 11:28:03
【问题描述】:

这是字典的样子:

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

【问题讨论】:

标签: python sorting dictionary


【解决方案1】:

标准 Python 字典是“无序的”。你可以使用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)])

【讨论】:

  • lambda x: 2*x+1 实际上与def f(x): return 2*x+1 相同。我用它作为一种较短的方法来编写一个选择元组中第一个元素(键)的函数。
【解决方案2】:

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

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

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

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

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

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

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

【讨论】:

  • 你会如何改变这个多维字典的答案?例如 4 维字典,如 docs_info{1:{2:{3:{55555}}}}
  • @ulkas 拉出任何 subdict 并像其他任何 subdict 一样对其进行排序。如果您希望将其展平为单个维度,请先执行此操作,然后再对其进行排序。展平逻辑将比您实现的任何排序行为更复杂。
【解决方案3】:

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

从 PyPI 安装很简单:

pip install sortedcontainers

如果您不能pip install,则只需从open-source repository 复制 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 模块还维护了几个流行实现的performance comparison

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-20
      • 2014-06-08
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      • 2020-09-26
      • 2016-06-14
      • 2011-03-01
      相关资源
      最近更新 更多