One way is to use sorted
with key
argument and a custom lambda
function.
Here we need to split by .
, take the last item and convert to 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']
If you need to sort first by the integer, then alphabetically by the initial part of the string:
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']
Related: Nested lambda statements when sorting lists