在Python中,我可以按文本的数值对文本进行排序吗?
我用Python编写了dict,其键的形式如下:在Python中,我可以按文本的数值对文本进行排序吗?,python,string,sorting,Python,String,Sorting,我用Python编写了dict,其键的形式如下: mydict = {'0' : 10, '1' : 23, '2.0' : 321, '2.1' : 3231, '3' : 3, '4.0.0' : 1, '4.0.1' : 10, '5' : 11, # ... etc '1
mydict = {'0' : 10,
'1' : 23,
'2.0' : 321,
'2.1' : 3231,
'3' : 3,
'4.0.0' : 1,
'4.0.1' : 10,
'5' : 11,
# ... etc
'10' : 32,
'11.0' : 3,
'11.1' : 243,
'12.0' : 3,
'12.1.0': 1,
'12.1.1': 2,
}
有些指数没有子值,有些指数有一级子值,有些指数有两级子值。如果我只有一个子级别,我就可以把它们都当作数字来处理,并进行数字排序。第二个子级别强制我将它们作为字符串处理。但是,如果我像字符串一样对它们进行排序,我将在1
和20
之后添加2
如何对索引进行正确排序
注意:我真正想做的是打印出按索引排序的dict。如果有比以某种方式排序更好的方法,那对我来说没问题。您可以按照您想要的方式对键进行排序,方法是在“.”上拆分键,然后将每个组件转换为整数,如下所示:
sorted(mydict.keys(), key=lambda a:map(int,a.split('.')))
[('0', 10),
('1', 23),
('2.0', 321),
('2.1', 3231),
('3', 3),
# ...
('12.1.1', 2)]
其中返回以下内容:
['0',
'1',
'2.0',
'2.1',
'3',
'4.0.0',
'4.0.1',
'5',
'10',
'11.0',
'11.1',
'12.0',
'12.1.0',
'12.1.1']
您可以迭代该键列表,并根据需要从字典中提取值
您还可以对mydict.items()的结果进行排序,非常类似:
sorted(mydict.items(), key=lambda a:map(int,a[0].split('.')))
这将为您提供(键、值)对的排序列表,如下所示:
sorted(mydict.keys(), key=lambda a:map(int,a.split('.')))
[('0', 10),
('1', 23),
('2.0', 321),
('2.1', 3231),
('3', 3),
# ...
('12.1.1', 2)]
Python的排序函数可以采用自定义比较函数,因此您只需定义一个函数,以您喜欢的方式比较键:
def version_cmp(a, b):
'''These keys just look like version numbers to me....'''
ai = map(int, a.split('.'))
bi = map(int, b.split('.'))
return cmp(ai, bi)
for k in sorted(mydict.keys(), version_cmp):
print k, mydict[k]
在这种情况下,最好使用键参数来排序()
。请参阅的答案以获取示例。我会在上搜索并查看答案。我也会读一读。该函数正是您需要的。作为答案的补充,可以用列表替换map()
调用。。。如果你喜欢那种风格。它也可能更有效(尽管我怀疑在这种情况下可以忽略不计)
sorted(mydict.keys(),key=lambda:[int(i)表示a.split('.')]中的i)
出于乐趣和实用性(主要用于谷歌ppl):
用作排序(列表,cmp=cmpg)
。
此外,正则表达式可能是预编译的(实际上,很少需要re模块的缓存)。
并且,它可以(容易地)修改,例如,包括负值(可能将-?
添加到num regex)和/或使用浮点值
它可能不是很有效,但即使如此,它还是非常有用的
而且,嗯,它也可以用作key=for sorted()。python网站上有一个很好的排序方法:。
它很好地介绍了排序,并讨论了使排序结果适应您需要的不同技术。这称为“自然排序”。请参阅,当然您不需要使用lambda,您可以用通常的方式定义函数并传入名称。比comparator版本更快(转换/函数调用更少)。python 3的语法更新:sorted(mydict.items(),key=lambda:[*map(int,a[0]。split('.)]
最好像Ian那样提供键函数。每个元素调用一次键函数,每次排序进行比较时调用cmp函数。@gnibbler:是的,我读了Ian的答案后意识到。。。我正在考虑删除我的答案,但我想这可能会对需要更复杂的比较的人有所帮助,而这不能通过传递一个简单的键来完成。