我可以在Python中按数字值排序文本吗?

11 投票
6 回答
7110 浏览
提问于 2025-04-15 14:54

我在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)]

撰写回答