【问题标题】:How can I sort a Python dictionary sort by key without using Ordereddict? [closed]如何在不使用 Ordereddict 的情况下按键排序 Python 字典? [关闭]
【发布时间】:2015-05-24 16:20:02
【问题描述】:

什么是不错的选择

{2:3, 1:89, 4:5, 2:0}

{1:89, 2:3, 2:0, 3:0} ?

【问题讨论】:

  • 你不能像你提到的那样对字典进行排序。因为他们在内部使用散列来存储元素并且没有这样的顺序。
  • 你能提供一个替代方案吗?
  • 我想对一个元组列表进行排序?怎么办?
  • OrderedDict,但你不希望这样。所以,在我看来,这似乎是一件不可能的事情。
  • 那么请编辑您的问题并确保它明确说明了这一点。

标签: python sorting dictionary ordereddictionary


【解决方案1】:

你要求的东西是不可能的,因为字典从定义上讲不是线性的东西,就像数学集一样。可能它使用某种树结构实习生,但实习生的工作方式并不重要,可能会发生变化,并且可能因实施而异。

另一方面,您可以生成字典的有序表示,例如打印出来展示给用户。一种可能性是使用listtuples。您可以使用dict.items() 获取所有字典项的列表。您可以使用list.sort() 对列表进行排序。

【讨论】:

    【解决方案2】:

    首先,您不能在字典中重复键,无论是有序的还是其他的!你有两次密钥2。创建 dict 时,这两个值之一将立即丢失。

    好的,假设所有的键都是唯一的。您永远不应该依赖字典中的项目顺序:

    CPython 实现细节:键和值以非随机的任意顺序列出,因 Python 实现而异,并且取决于字典的插入和删除历史。

    (来自the docs

    这就是有 OrderedDict 的原因。 OrderedDict 之后的下一个最好的事情是什么?我猜是这样的:

    >>> d = {2:3, 1:89, 4:5, 2:0, 50: 5, 6: 6}
    
    >>> d  # lost "2:3" pair!
    {1: 89, 2: 0, 4: 5, 50: 5, 6: 6}
    
    >>> l = d.items()
    
    >>> l
    [(1, 89), (2, 0), (4, 5), (50, 5), (6, 6)]
    
    >>> l.sort()
    
    >>> l
    [(1, 89), (2, 0), (4, 5), (6, 6), (50, 5)]
    

    这是一个键值对列表。由您负责从中获取值等。重要的是从不执行dict(l),因为这可能会改变项目的顺序。即使它看起来有效,也不要这样做! (公平地说:你可以做到,只是不要依赖结果字典中的项目顺序。或者在任何其他字典中,如上面的引用所述。)

    您可以在一个类中实现这一点,但是您将重新发明 OrderedDict 类,并且可能没有那么好。


    出于好奇:为什么不能使用 OrderedDict?

    【讨论】:

      猜你喜欢
      • 2021-09-25
      • 2018-09-19
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      相关资源
      最近更新 更多