我需要通过数字val对字典进行排序,如下例所示:
123ABC Example 1
514WE Example2
192DF Example 3
SO上的
sorted(mydict.keys(), key=lambda a:map(int,a.split('.')))
但这会分裂在'。'而且我没有这个选择 - 我会采取什么措施来实现这一目标?
排序看起来像这样:
123ABC Example 1
192DF Example 3
514WE Example2
答案 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()。