sort a list of strings and numbers by number

Question:

Help please :

myliste = ['Bullet traint5018n', 'Preyt508n', 'Treize viest1978n', 'L’année du requint4398n', 'Cartert5004n', 'Night Raiderst1312n', 'En décalaget1789n', 'The Bikeriderst2134n', 'Darlingt2008n', 'Alina of Cubat678n', 'Amants Super-héroïquest837n', 'Ménestrelt3065n', 'Des feux dans la nuitt2144n', 'Luckt3148n', 'Sita Ramamt4498n', 'Poikkal Kudhirait2248n', 'Les Promesses d’Hasant3598n', 'Wedding Seasont2490n', 'Le Destin des Tortues Ninja, le Filmt845n', 'La Vie en plus grandt489n', 'Hero Modet245n', 'Embuscadet1038n', 'The Last Sont1245n', 'Mission Eaglet998n', 'Doblemente Embarazadat745']

I want to sort this list according to the number, from the highest number to the lowest without changing the elements of my list, I have tried this :

def sort_films(LF):
        a = i.index('t')
        b = i.index('n')
        c = i[a+2:b]
        return(c)

LF.sort(key=sort_films,reverse=True)

the result I have is :

['Wedding Seasont2490n', 'Treize viest1978n', 'The Last Sont1245n', 'The Bikeriderst2134n', 'Sita Ramamt4498n', 'Preyt508n', 'Poikkal Kudhirait2248n', 'Night Raiderst1312n', 'Ménestrelt3065n', 'Mission Eaglet998n', 'L’année du requint4398n', 'Luckt3148n', 'Les Promesses d’Hasant3598n', 'Le Destin des Tortues Ninja, le Filmt845n', 'La Vie en plus grandt489n', 'Hero Modet245n', 'En décalaget1789n', 'Embuscadet1038n', 'Doblemente Embarazadat745', 'Des feux dans la nuitt2144n', 'Darlingt2008n', 'Cartert5004n', 'Bullet traint5018n', 'Amants Super-héroïquest837n', 'Alina of Cubat678n']

I don’t know what to do please if you have a solution

Asked By: Az7

||

Answers:

This seems to work as expected:

LF = ['Bullet traint5018n', 'Preyt508n', 'Treize viest1978n', 'L’année du requint4398n', 'Cartert5004n', 'Night Raiderst1312n', 'En décalaget1789n', 'The Bikeriderst2134n', 'Darlingt2008n', 'Alina of Cubat678n', 'Amants Super-héroïquest837n', 'Ménestrelt3065n', 'Des feux dans la nuitt2144n', 'Luckt3148n', 'Sita Ramamt4498n', 'Poikkal Kudhirait2248n', 'Les Promesses d’Hasant3598n', 'Wedding Seasont2490n', 'Le Destin des Tortues Ninja, le Filmt845n', 'La Vie en plus grandt489n', 'Hero Modet245n', 'Embuscadet1038n', 'The Last Sont1245n', 'Mission Eaglet998n', 'Doblemente Embarazadat745n']

def sort_films(i):
        a = i.index('t')
        try:
            b = i.index('n')
        except:
            b = len(i)
        c = int(i[a+1:b]) # +1 instead of +2 as first digit must not be skipped
        return(c)

LF.sort(key=sort_films,reverse=True)
print(LF)

Output:

['Bullet traint5018n', 'Cartert5004n', 'Sita Ramamt4498n', 'L’année du requint4398n', 'Les Promesses d’Hasant3598n', 'Luckt3148n', 'Ménestrelt3065n', 'Wedding Seasont2490n', 'Poikkal Kudhirait2248n', 'Des feux dans la nuitt2144n', 'The Bikeriderst2134n', 'Darlingt2008n', 'Treize viest1978n', 'En décalaget1789n', 'Night Raiderst1312n', 'The Last Sont1245n', 'Embuscadet1038n', 'Mission Eaglet998n', 'Le Destin des Tortues Ninja, le Filmt845n', 'Amants Super-héroïquest837n', 'Doblemente Embarazadat745', 'Alina of Cubat678n', 'Preyt508n', 'La Vie en plus grandt489n', 'Hero Modet245n']
Answered By: Bibhav

You can use regex and a lambda function to provide the key for sort. d+ will find strings of at least one number in each list item. To avoid the case of a number in the title, the sort is done on the last number found in the list item.

import re
sorted_myliste =  sorted(myliste, key=lambda x: int(re.findall(r'd+', x)[-1]), reverse=True)
Answered By: bn_ln

Approach with filter + str.isdigit,

sorted(myliste, key=lambda x: int(''.join(filter(str.isdigit, x))), reverse=True)

Output:

['Bullet traint5018n', 'Cartert5004n', 'Sita Ramamt4498n', 'L’année du requint4398n', 'Les Promesses d’Hasant3598n', 'Luckt3148n', 'Ménestrelt3065n', 'Wedding Seasont2490n', 'Poikkal Kudhirait2248n', 'Des feux dans la nuitt2144n', 'The Bikeriderst2134n', 'Darlingt2008n', 'Treize viest1978n', 'En décalaget1789n', 'Night Raiderst1312n', 'The Last Sont1245n', 'Embuscadet1038n', 'Mission Eaglet998n', 'Le Destin des Tortues Ninja, le Filmt845n', 'Amants Super-héroïquest837n', 'Doblemente Embarazadat745', 'Alina of Cubat678n', 'Preyt508n', 'La Vie en plus grandt489n', 'Hero Modet245n']
Answered By: Rahul K P

If you are okay with using numpy and re, you can convert to numpy array and then use re to extract the numbers. Then you can sort the array with argsort.

import re
import numpy as np


def sort_films(LF, reverse=False):
    numbers = np.array([re.findall(r'd+', s) for s in myliste]).flatten().astype(int)
    if reverse==False:
        return list(np.array(myliste)[np.argsort(numbers)])
    else:
        return list(np.array(myliste)[np.argsort(numbers)][::-1])

Then sort_films(myliste) outputs:

['Hero Modet245n', 'La Vie en plus grandt489n', 'Preyt508n',
   'Alina of Cubat678n', 'Doblemente Embarazadat745',
   'Amants Super-héroïquest837n',
   'Le Destin des Tortues Ninja, le Filmt845n',
   'Mission Eaglet998n', 'Embuscadet1038n',
   'The Last Sont1245n', 'Night Raiderst1312n',
   'En décalaget1789n', 'Treize viest1978n', 'Darlingt2008n',
   'The Bikeriderst2134n', 'Des feux dans la nuitt2144n',
   'Poikkal Kudhirait2248n', 'Wedding Seasont2490n',
   'Ménestrelt3065n', 'Luckt3148n',
   'Les Promesses d’Hasant3598n', 'L’année du requint4398n',
   'Sita Ramamt4498n', 'Cartert5004n', 'Bullet traint5018n']

and sort_films(myliste, reverse=True) gives

['Bullet traint5018n', 'Cartert5004n', 'Sita Ramamt4498n',
   'L’année du requint4398n', 'Les Promesses d’Hasant3598n',
   'Luckt3148n', 'Ménestrelt3065n', 'Wedding Seasont2490n',
   'Poikkal Kudhirait2248n', 'Des feux dans la nuitt2144n',
   'The Bikeriderst2134n', 'Darlingt2008n', 'Treize viest1978n',
   'En décalaget1789n', 'Night Raiderst1312n',
   'The Last Sont1245n', 'Embuscadet1038n',
   'Mission Eaglet998n',
   'Le Destin des Tortues Ninja, le Filmt845n',
   'Amants Super-héroïquest837n', 'Doblemente Embarazadat745',
   'Alina of Cubat678n', 'Preyt508n',
   'La Vie en plus grandt489n', 'Hero Modet245n']
Answered By: ML-Nielsen
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.