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