我有一个python列表,其中包含字符串,但每个字符串的最后一部分都有一个数字。我需要以数字递增的方式对此列表进行排序:
[u'TC DUMAZILE. Warning n.12', u'TC DUMAZILE. Warning n.4', u'TC DUMAZILE. Warning n.8', u'TC ELEVEN. Warning n.1', u'TC ELIAKIM. Warning n.10', u'TC ELIAKIM. Warning n.14', u'TC ELIAKIM. Warning n.2', u'TC ELIAKIM. Warning n.6', u'TC HOLA. Warning n.4', u'TC HOLA. Warning n.8', u'TC TWELVE. Warning n.1']
我使用了sorted()函数,这些函数按字母顺序对名称进行排序,但没有考虑每个字符串最后一部分的数字。
答案 0 :(得分:3)
一种方法是将sorted
与key
参数和自定义lambda
函数一起使用。
我们需要按.
拆分,取最后一项并转换为int
。
lst = [u'TC DUMAZILE. Warning n.12', u'TC DUMAZILE. Warning n.4', u'TC DUMAZILE. Warning n.8', u'TC ELEVEN. Warning n.1', u'TC ELIAKIM. Warning n.10', u'TC ELIAKIM. Warning n.14', u'TC ELIAKIM. Warning n.2', u'TC ELIAKIM. Warning n.6', u'TC HOLA. Warning n.4', u'TC HOLA. Warning n.8', u'TC TWELVE. Warning n.1']
res = sorted(lst, key=lambda x: int(x.rsplit('.', 1)[-1]))
# ['TC ELEVEN. Warning n.1',
# 'TC TWELVE. Warning n.1',
# 'TC ELIAKIM. Warning n.2',
# 'TC DUMAZILE. Warning n.4',
# 'TC HOLA. Warning n.4',
# 'TC ELIAKIM. Warning n.6',
# 'TC DUMAZILE. Warning n.8',
# 'TC HOLA. Warning n.8',
# 'TC ELIAKIM. Warning n.10',
# 'TC DUMAZILE. Warning n.12',
# 'TC ELIAKIM. Warning n.14']
如果您需要先按整数排序,则按字母顺序按字符串的初始部分排序:
def sorter_func(x):
y = x.split('.')
return int(y[-1]), y[0]
res = sorted(lst, key=sorter_func)
# ['TC ELEVEN. Warning n.1',
# 'TC TWELVE. Warning n.1',
# 'TC ELIAKIM. Warning n.2',
# 'TC DUMAZILE. Warning n.4',
# 'TC HOLA. Warning n.4',
# 'TC ELIAKIM. Warning n.6',
# 'TC DUMAZILE. Warning n.8',
# 'TC HOLA. Warning n.8',
# 'TC ELIAKIM. Warning n.10',
# 'TC DUMAZILE. Warning n.12',
# 'TC ELIAKIM. Warning n.14']
答案 1 :(得分:0)
import re
regex = re.compile('([0-9]+)$')
l = [u'TC DUMAZILE. Warning n.12', u'TC DUMAZILE. Warning n.4', u'TC DUMAZILE. Warning n.8', u'TC ELEVEN. Warning n.1', u'TC ELIAKIM. Warning n.10', u'TC ELIAKIM. Warning n.14', u'TC ELIAKIM. Warning n.2', u'TC ELIAKIM. Warning n.6', u'TC HOLA. Warning n.4', u'TC HOLA. Warning n.8', u'TC TWELVE. Warning n.1']
print(sorted(l,key=lambda i: int(regex.search(i).groups()[0])))