按数字值排序字典(文本键)

时间:2016-03-14 12:10:52

标签: python sorting dictionary

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

123ABC Example 1

514WE  Example2

192DF  Example 3
SO上的

I found this

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

但这会分裂在'。'而且我没有这个选择 - 我会采取什么措施来实现这一目标?

排序看起来像这样:

123ABC Example 1

192DF  Example 3

514WE  Example2

3 个答案:

答案 0 :(得分:3)

如果密钥格式为NNNNWWWWW,其中NNNN为数字,WWW为字母,您希望根据{{1}的数值对项目进行排序}前缀,您可以使用:

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

答案 1 :(得分:1)

您可以使用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']

答案 2 :(得分:0)

一种选择是使用OrderedDict()。它的工作原理与普通的python字典相同,但它保持插入其中的对象的顺序。因此,您不需要任何排序,只需按您需要的顺序更新OrderedDict()。