【问题标题】:Sort Dictionary Keys in natural order [duplicate]按自然顺序对字典键进行排序[重复]
【发布时间】:2014-08-02 06:55:43
【问题描述】:

我想按“自然顺序”对字典键进行排序。如果我有一本带钥匙的字典

    d = {"key1" : object, "key11" : object, "key2" : object, "key22" : object", "jay1" : object, "jay2" : object}

我想对这个字典进行排序,结果是:

    d = { "jay1" : object, "jay2" : object, "key_1" : object, "key_2" : object, "key_11" : object, "key_22" : object"}

【问题讨论】:

  • 字典未排序。您无法控制字典键的顺序。
  • 您是在问如何“对字典进行排序”(在这种情况下问题是重复的)还是如何按自然顺序对(任何内容)进行排序(很确定它是重复的)?
  • 我不相信这是重复的,因为它被标记为重复的问题是关于标准排序的,而这个问题是关于自然排序的。

标签: python dictionary natural-sort


【解决方案1】:

你可以把你的字典改成OrderedDict:

import collections, re

d = {"key1" : 'object', "key11" : 'object', "key2" : 'object', "key22" : 'object', "jay1" : 'object', "jay2" : 'object'}


my_fun = lambda k,v: [k, int(v)]

d2 = collections.OrderedDict(sorted(d.items(), key=lambda t: my_fun(*re.match(r'([a-zA-Z]+)(\d+)',t[0]).groups())))

print(d2)
#reslt: OrderedDict([('jay1', 'object'), ('jay2', 'object'), ('key1', 'object'), ('key11', 'object'), ('key2', 'object'), ('key22', 'object')])

基本上,这里发生了什么,我将字符串分成“字符串”部分和数字部分。数字部分更改为int,并使用这两个值进行排序。

【讨论】:

  • 这不会按自然顺序对键进行排序。
  • @user2909250 抱歉,我修改了示例以包含缺失的“自然”顺序。
  • 您可以通过使用natsort.natsorted 来避免冗长的lambda 和正则表达式。
【解决方案2】:

正如其他人所说,字典没有顺序。但是,如果您想以自然顺序遍历这些键,则可以执行以下操作:

d = {"key1" : object, "key11" : object, "key2" : object, "key22" : object, "jay1" : object, "jay2" : object}
sortedKeys = sorted(d.keys())
print sortedKeys
for key in sortedKeys:
    print d[key]

【讨论】:

    【解决方案3】:

    在 Python 中,{'a': object, 'b': object}{'b': object, 'a': object} 完全相同,因为字典没有排序。

    【讨论】:

      【解决方案4】:

      您不能订购dictionaries,因为他们的顺序看似是任意的(实际上并非如此)。相反,您可以使用natsort.natsorted()items() 进行排序:

      d = {"key1" : object, "key11" : object, "key2" : object, "key22" : object, "jay1" : object, "jay2" : object}
      print natsort.natsorted(d.items()) #[('jay1', <type 'object'>), ('jay2', <type 'object'>), ('key1', <type 'object'>), ('key2', <type 'object'>), ('key11', <type 'object'>), ('key22', <type 'object'>)]
      

      【讨论】:

      • 这不会按自然顺序对键进行排序。
      • @user2909250 现在可以了 :)
      猜你喜欢
      • 2018-02-19
      • 2018-01-27
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      • 2012-04-12
      相关资源
      最近更新 更多