我可以在Python中按数字值排序文本吗?
我在Python中有一个字典,里面的键(也就是索引)大致是这样的:
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,
}
有些索引没有子值,有些有一层子值,还有些有两层子值。如果只有一层子值,我可以把它们都当作数字来排序,直接按数字大小排就行了。但是因为有了第二层子值,我就必须把它们当作字符串来处理了。不过,如果我按字符串来排序的话,10
会排在1
后面,20
又会排在2
后面,这样就不对了。
那我该怎么正确地排序这些索引呢?
注意:我其实想要的是把字典按索引排序后打印出来。如果有比排序更好的方法,我也很乐意接受。
6 个回答
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]
不过在这种情况下,最好使用sorted()
里的key
参数。可以参考Ian Clelland的回答,里面有个例子。
2
作为对Ian Clelland回答的补充,map()
这个调用可以用列表推导式来替代……如果你更喜欢这种写法的话。这样做可能也会更高效(不过在这个例子中,我觉得差别不大)。
sorted(mydict.keys(), key=lambda a: [int(i) for i in a.split('.')])
19
你可以按照自己想要的方式对键进行排序,方法是用 '.' 将它们分开,然后把每个部分转换成整数,像这样:
sorted(mydict.keys(), key=lambda a:map(int,a.split('.')))
这样会返回这个结果:
['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('.')))
这样你就会得到一个排序好的 (键, 值) 对的列表,像这样:
[('0', 10),
('1', 23),
('2.0', 321),
('2.1', 3231),
('3', 3),
# ...
('12.1.1', 2)]