-1

I have a python list which contains strings but the last part of each string has a number. I need to sort this list in a way that the numbers are ascending:

[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']

I have used the sorted() functions which sorts the names alphabetically but it doesn't take into consideration the number on the last part of each string.

user1919
  • 3,422
  • 13
  • 50
  • 85

2 Answers2

3

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

jpp
  • 134,728
  • 29
  • 196
  • 240
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])))