【问题标题】:How to sort OrderedDict when keys contains strings and numbers - Python [duplicate]当键包含字符串和数字时如何对 OrderedDict 进行排序 - Python [重复]
【发布时间】:2013-11-13 03:47:05
【问题描述】:

我正在使用OrderedDict 对键包含字符串和数字的dict 进行排序。这是我的代码:

from collections import OrderedDict
x = {}
x['mon'] = 10
x['day_1'] = 1
x['day_2'] = 2
x['day_10'] = 10
x['day_11'] = 11
dictionary1 = OrderedDict(sorted(x.items(), key=lambda t: len(t[0])))
dictionary2 = OrderedDict(sorted(x.items(), key=lambda t: t[0]))

我希望输出看起来像(我不在乎mon:2 的位置):

OrderedDict([('mon', 2), ('day_1', 1), ('day_2', 2), ('day_10', 10), ('day_11', 11)])

但是这两种方法都不起作用。所以我想我可能需要自定义排序规则?有什么建议吗?

更新:

这是我的综合答案(Simeon Visser 和 hcwhsa):

def convert_dict_key(key):
    try:
        return int(key.split('_')[1])
    except:
        return key

alphanum_key = lambda (key, value): convert_dict_key(key)
dictionary = sorted(dictionary.items(), key=alphanum_key)

【问题讨论】:

  • 这被称为“自然排序”
  • @hcwhsa:有点。但是那个帖子没有使用OrderDict的解决方案
  • @tao.hong 你在这里排序列表(x.items())而不是OrderedDict
  • @感谢您指出这一点。我确实从那篇文章中得到了一个想法。

标签: python


【解决方案1】:

你可以这样做:

>>> dictionary3 = OrderedDict(sorted(x.items(), key=lambda (key, value): int(key.split('_')[1])))
>>> dictionary3
OrderedDict([('day_1', 1), ('day_2', 2), ('day_10', 10), ('day_11', 11)])

这会按'_' 拆分键并将日期数字排序为整数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2019-03-28
    • 2016-01-23
    • 2012-12-08
    • 2016-10-28
    相关资源
    最近更新 更多