【问题标题】:Sort Dictionary (Text keys) by Numeric Value按数值排序字典(文本键)
【发布时间】:2016-03-14 20:31:28
【问题描述】:

我需要按数字 val 对字典进行排序,如下例所示:

123ABC Example 1

514WE  Example2

192DF  Example 3

I found this 在 SO:

sorted(mydict.keys(), key=lambda a:map(int,a.split('.')))

但这会在“。”上分裂。而且我没有这个选项 - 关于我会做些什么来实现这一点的任何想法?

排序后看起来像这样:

123ABC Example 1

192DF  Example 3

514WE  Example2

【问题讨论】:

  • 我不明白你的字典是什么样子的 :)
  • 你提供输入,但你不提供输出。您希望排序后的版本是什么样的?
  • 我有一个问题 - Bakuriu 和 tobias_k 并列 - 我接受哪个答案?我认为它们实际上相差几秒钟......

标签: python sorting dictionary


【解决方案1】:

如果键的格式总是NNNNWWWWW,其中NNNN 是数字,WWW 是字母,并且您想根据NNNNN 前缀的数值对项目进行排序,您可以使用:

import string

sorted(mydict, key=lambda x: int(x.lower().rstrip(string.ascii_lowercase)))

这个想法是简单地删除包含字母的字符串的右侧部分,然后将剩余的NNNN 部分转换为数字。

或者,您必须使用如下正则表达式:

import re
num_regex = re.compile(r'\d+')

sorted(mydict, key=lambda x: int(num_regex.match(x).group(0)))

这应该更健壮。它将123A12 排序为与123A 相同,而第一个解决方案将产生ValueError

【讨论】:

    【解决方案2】:

    您可以使用regular expression 来获取字符串开头的数字部分并将其用于排序。但是请注意,这不会进行任何错误检查:如果键不以数字开头,则会引发异常。

    >>> mydict = {"123ABC": "Example 1",
    ...           "514WE":  "Example2",
    ...           "192DF":  "Example 3"}
    ...     
    >>> [re.match(r"\d+", s).group() for s in mydict]
    ['192', '123', '514']
    >>> sorted(mydict, key=lambda s: int(re.match(r"\d+", s).group()))
    ['123ABC', '192DF', '514WE']
    

    【讨论】:

      【解决方案3】:

      一个选项是您使用OrderedDict()。它的工作方式与普通 python 字典相同,但它维护插入其中的对象的顺序。因此您不需要任何排序,只需按照您需要的顺序更新 OrderedDict()。

      【讨论】:

        猜你喜欢
        • 2017-05-30
        • 2015-10-10
        • 1970-01-01
        • 1970-01-01
        • 2017-08-20
        • 1970-01-01
        • 2014-01-18
        • 2021-11-27
        • 2011-06-17
        相关资源
        最近更新 更多