如何对包含最后一个数字的字符串的python列表进行排序

时间:2018-04-19 10:17:21

标签: python list sorting

我有一个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()函数,这些函数按字母顺序对名称进行排序,但没有考虑每个字符串最后一部分的数字。

2 个答案:

答案 0 :(得分:3)

一种方法是将sortedkey参数和自定义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']

相关:Nested lambda statements when sorting lists

答案 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])))