根据数字对混合字符串列表进行排序

时间:2016-08-24 17:43:34

标签: python

如何通过数值对此列表进行排序?是否需要删除数字的正则表达式,还是有更多的Pythonic方法来执行此操作?

to_sort

['12-foo',
 '1-bar',
 '2-bar',
 'foo-11',
 'bar-3',
 'foo-4',
 'foobar-5',
 '6-foo',
 '7-bar']

所需的输出如下:

1-bar
2-bar
bar-3
foo-4
foobar-5
6-foo
7-bar
foo-11
12-foo

2 个答案:

答案 0 :(得分:10)

一种解决方案是以下正则表达式提取:

sorted(l, key=lambda x: int(re.search('\d+', x).group(0)))
>>> l
['12-foo', '1-bar', '2-bar', 'foo-11', 'bar-3', 'foo-4', 'foobar-5', '6-foo', '7-bar']
>>> sorted(l, key=lambda x: int(re.search('\d+', x).group(0)))
['1-bar', '2-bar', 'bar-3', 'foo-4', 'foobar-5', '6-foo', '7-bar', 'foo-11', '12-foo']

key是提取的数字(转换为int以避免按字母顺序排序)。

答案 1 :(得分:4)

如果您不想使用正则表达式

>>> l = ['12-foo', '1-bar', '2-bar', 'foo-11', 'bar-3', 'foo-4', 'foobar-5', '6-foo', '7-bar']

>>> sorted(l, key = lambda x: int(''.join(filter(str.isdigit, x))))

['1-bar', '2-bar', 'bar-3', 'foo-4', 'foobar-5', '6-foo', '7-bar', 'foo-11', '12-foo']