【问题标题】:How can I sort this dictionary with alphabetically?如何按字母顺序对这本字典进行排序?
【发布时间】:2013-04-03 02:44:01
【问题描述】:

这是字典:

lettersandnumbers = {'Z': 1, 'Y': 0, 'X': 1, 'W': 17, 'V': 4, 'U': 0,\
 'T': 22, 'S': 21, 'R': 31, 'Q': 0, 'P': 12, 'O': 8,\
 'N': 10, 'M': 29, 'L': 27, 'K': 14, 'J': 51, 'I': 7,\
 'H': 14, 'G': 21, 'F': 12, 'E': 27, 'D': 40, 'C': 43,\
 'B': 28, 'A': 34}

我希望它按字母顺序排序。 我试过把它做成一个列表,这样我就可以使用 sorted 函数,但我完全迷路了。 有什么想法吗?

【问题讨论】:

  • 令人震惊的是,这似乎不是重复的。我能找到的所有其他问题都是关于按 value 排序的。 :-)
  • @ajkey94 不需要反斜杠!!!它只是让它看起来很难看,你仍然可以使用逗号将它分成几行而不用它们

标签: python python-3.x


【解决方案1】:

有几种方法可以进行迭代,上面的链接描述了对字典进行排序以供一次性使用的方法。如果您需要 persistent 有序字典,从 Python 2.7 和 3.x 开始,您可以使用 OrderedDict 集合,参见下面的示例:

>>> from collections import OrderedDict
# Random dictionary
>>> foo = {'a': 1, 'b':2, 'e':4, 'd':6, 'f': 7}
>>> foo
{'a': 1, 'b':2, 'e':4, 'd':6, 'f': 7}
# OrderedDict remember order of insert, hence to maintain a sorted
# dictionary entry, we must supplies a sorted tuple the example below
# sorted by entry key
>>> bar = OrderedDict(sorted(foo.items(), key=lambda t: t[0]))
>>> bar
OrderedDict([('a', 1), ('b', 2), ('d', 6), ('e', 4), ('f', 7)])

尽管符号不同,bar 对象的功能与字典相同。

【讨论】:

  • 在 sorted 调用中不需要键函数 - 默认的元组排序将给出相同的结果。
  • 确实如此。我通常使用显式密钥并忘记所有关于默认行为的信息。编辑:我认为将关键示例留在那里会很有用。
  • @Nerolynx 简单胜于复杂!如果你把它拿出来,我会支持你;)
  • @jamylak 并不是说​​我拒绝更新答案。它只是一个很好的小例子,说明如何使用 sorted 对键进行排序。还不如离开它。
【解决方案2】:

字典只是一个容器。如果您想按排序顺序迭代键,请参阅In Python, how do I iterate over a dictionary in sorted order?

【讨论】:

  • 你不能对哈希表进行排序,句号。
  • 请解释为什么您认为OrderedDict 没有达到 OP 想要的效果
  • 它没有排序。 :) 如果您添加了以前没有在字典中的键,它将被添加到字典的末尾。实时调频
  • OP 只想排序一次 + 字母表中没有更多的字母可以添加!
  • 我没有看到任何迹象表明 OP 只需要字母——它可能只是一个示例。
【解决方案3】:
>>> from collections import OrderedDict
>>> from string import ascii_uppercase as alphabet
>>> d = {'Z': 1, 'Y': 0, 'X': 1, 'W': 17, 'V': 4, 'U': 0, 'T': 22, 'S': 21, 'R': 31, 'Q': 0, 'P': 12, 'O': 8,'N': 10, 'M': 29, 'L': 27, 'K': 14, 'J': 51, 'I': 7,      'H': 14, 'G': 21, 'F': 12, 'E': 27, 'D': 40, 'C': 43, 'B': 28, 'A': 34}
>>> OrderedDict((k, d[k]) for k in alphabet if k in d)
OrderedDict([('A', 34), ('B', 28), ('C', 43), ('D', 40), ('E', 27), ('F', 12), ('G', 21), ('H', 14), ('I', 7), ('J', 51), ('K', 14), ('L', 27), ('M', 29), ('N', 10), ('O', 8), ('P', 12), ('Q', 0), ('R', 31), ('S', 21), ('T', 22), ('U', 0), ('V', 4), ('W', 17), ('X', 1), ('Y', 0), ('Z', 1)])

【讨论】:

    【解决方案4】:

    由于@Nerolynx 拒绝使用这种更简单、更快捷的方法

    >>> from collections import OrderedDict
    >>> d = {'Z': 1, 'Y': 0, 'X': 1, 'W': 17, 'V': 4, 'U': 0, 'T': 22, 'S': 21, 'R': 31, 'Q': 0, 'P': 12, 'O': 8,'N': 10, 'M': 29, 'L': 27, 'K': 14, 'J': 51, 'I': 7,      'H': 14, 'G': 21, 'F': 12, 'E': 27, 'D': 40, 'C': 43, 'B': 28, 'A': 34}
    >>> OrderedDict(sorted(d.items()))
    OrderedDict([('A', 34), ('B', 28), ('C', 43), ('D', 40), ('E', 27), ('F', 12), ('G', 21), ('H', 14), ('I', 7), ('J', 51), ('K', 14), ('L', 27), ('M', 29), ('N', 10), ('O', 8), ('P', 12), ('Q', 0), ('R', 31), ('S', 21), ('T', 22), ('U', 0), ('V', 4), ('W', 17), ('X', 1), ('Y', 0), ('Z', 1)])
    

    【讨论】:

      【解决方案5】:

      如果你使用[some dict].items(),它会产生一个元组列表:

      >>> d={3:'three',35:'thirty five',100:'one hindred'}
      >>> d
      {35: 'thirty five', 3: 'three', 100: 'one hindred'}
      >>> d.items()
      [(35, 'thirty five'), (3, 'three'), (100, 'one hindred')]
      

      元组在 Python 中是可排序的:

      >>> sorted(d.items())
      [(3, 'three'), (35, 'thirty five'), (100, 'one hindred')]
      

      因此,您的字典会按照 Python 的默认排序顺序进行排序:

      >>> lettersandnumbers = {'Z': 1, 'Y': 0, 'X': 1, 'W': 17, 'V': 4, 'U': 0,'T': 22, 'S': 21, 'R': 31, 'Q': 0, 'P': 12, 'O': 8,'N': 10, 'M': 29, 'L': 27, 'K': 14, 'J': 51, 'I': 7,'H': 14, 'G': 21, 'F': 12, 'E': 27, 'D': 40, 'C': 43,'B': 28, 'A': 34}
      >>> sorted(lettersandnumbers.items())
      [('A', 34), ('B', 28), ('C', 43), ('D', 40), ('E', 27), ('F', 12), ('G', 21), ('H', 14), ('I', 7), ('J', 51), ('K', 14), ('L', 27), ('M', 29), ('N', 10), ('O', 8), ('P', 12), ('Q', 0), ('R', 31), ('S', 21), ('T', 22), ('U', 0), ('V', 4), ('W', 17), ('X', 1), ('Y', 0), ('Z', 1)]
      

      (如果所需顺序与默认顺序不同,您可能需要使用 sorted 的 key 参数。在这种情况下,默认值有效。)

      如果你想要一个保持这个顺序的字典:

      >>> from collections import OrderedDict
      >>> od=OrderedDict(sorted(lettersandnumbers.items()))
      >>> od.items()[0]
      ('A', 34)
      >>> od.items()[-1]
      ('Z', 1)
      

      但有序 dict 是基于插入顺序的,所以如果你添加任何不按排序顺序的东西,它将是未排序的。

      更好的是,避免制作不必要的 dict 副本,只需按照当前排序顺序根据需要迭代 dict:

      for k,v in sorted(d.items()): 
          # deal with the key and value in sorted order at that moment...
      

      使用 Python 2,您需要使用 d.iteritems() 否则您将生成 2 个临时列表:1 个用于项目,1 个用于排序。使用 Py 3(或使用 Py 2 和 d.iteritems() 方法)只为排序生成 1 个临时列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-27
        • 1970-01-01
        • 1970-01-01
        • 2020-11-26
        • 1970-01-01
        • 2021-12-20
        • 2014-01-26
        相关资源
        最近更新 更多