简体   繁体   中英

How to sort a python list of strings which contain a number in the end

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.

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM