Given a list of strings. The task is to sort the list by the numeric part of the string.
Examples:
Input : test_list = [“Gfg34”, “is67”, “be3st”, “f23or”, “ge9eks”]
Output : [‘be3st’, ‘ge9eks’, ‘f23or’, ‘Gfg34’, ‘is67’]
Explanation : 3 < 9 < 23 < 34 < 67, numbers extracted from strings.Input : test_list = [“Gfg4”, “is67”, “be3st”, “f23or”, “ge9eks”]
Output : [‘be3st’, ‘Gfg4’, ‘ge9eks’, ‘f23or’, ‘is67’]
Explanation : 3 < 4 < 9 < 23 < 67, numbers extracted from strings.
Method #1 : Using sort() + re.findall()
In this, we perform the task of sorting using sort(), the explicit function is used to extract numbers using findall().
Python3
# Python3 code to demonstrate working of # Sort Strings on numerical substrings # Using sort() + findall() import re # helper function to perform sort def num_sort(test_string): return list ( map ( int , re.findall(r '\d+' , test_string)))[ 0 ] # initializing list test_list = [ "Gfg34" , "is67" , "be3st" , "f23or" , "ge9eks" ] # printing original list print ( "The original list is : " + str (test_list)) # calling function test_list.sort(key = num_sort) # printing result print ( "Strings after numerical Sort : " + str (test_list)) |
The original list is : ['Gfg34', 'is67', 'be3st', 'f23or', 'ge9eks'] Strings after numerical Sort : ['be3st', 'ge9eks', 'f23or', 'Gfg34', 'is67']
Time Complexity: O(nlogn)
Auxiliary Space: O(n)
Method #2 : Using sort() + lambda + findall()
In this, we perform a similar function, but the difference being we use lambda function rather than an external function to perform the task of sorting.
Python3
# Python3 code to demonstrate working of # Sort Strings on numerical substrings # Using sort() + lambda + findall() import re # initializing list test_list = [ "Gfg34" , "is67" , "be3st" , "f23or" , "ge9eks" ] # printing original list print ( "The original list is : " + str (test_list)) # findall() getting all integers. # conversion to integers using map() test_list.sort(key = lambda test_string : list ( map ( int , re.findall(r '\d+' , test_string)))[ 0 ]) # printing result print ( "Strings after numerical Sort : " + str (test_list)) |
The original list is : ['Gfg34', 'is67', 'be3st', 'f23or', 'ge9eks'] Strings after numerical Sort : ['be3st', 'ge9eks', 'f23or', 'Gfg34', 'is67']
Time Complexity: O(nlogn)
Auxiliary Space: O(n)
Method #3 : Using extend(),sort() and index() methods
Python3
# Python3 code to demonstrate working of # Sort Strings on numerical substrings # initializing list test_list = [ "Gfg34" , "is67" , "be3st" , "f23or" , "ge9eks" ] # printing original list print ( "The original list is : " + str (test_list)) x = [] dig = "0123456789" for i in test_list: p = "" for j in i: if j in dig: p + = j x.append( int (p)) y = [] y.extend(x) x.sort() res = [] for i in x: res.append(test_list[y.index(i)]) # printing result print ( "Strings after numerical Sort : " + str (res)) |
The original list is : ['Gfg34', 'is67', 'be3st', 'f23or', 'ge9eks'] Strings after numerical Sort : ['be3st', 'ge9eks', 'f23or', 'Gfg34', 'is67']
Time Complexity : O(NlogN)
Auxiliary Space : O(N)
Method#4: Using list comprehension
Python3
import re test_list = [ "Gfg34" , "is67" , "be3st" , "f23or" , "ge9eks" ] print ( "The original list is : " + str (test_list)) substrings = [ int (x) for string in test_list for x in re.findall(r '\d+' , string)] substrings.sort() res = [string for x in substrings for string in test_list if int (re.findall(r '\d+' , string)[ 0 ]) = = x] print ( "Strings after numerical Sort : " + str (res)) #This code is contributed by Vinay Pinjala. |
The original list is : ['Gfg34', 'is67', 'be3st', 'f23or', 'ge9eks'] Strings after numerical Sort : ['be3st', 'ge9eks', 'f23or', 'Gfg34', 'is67']
Time Complexity : O(NlogN)
Auxiliary Space : O(N)
Method #5: Using isdigit() method
- Initialize the input list of strings test_list.
- Use the sorted() function to sort the list based on a key function. The key function is defined using a lambda function that takes each string x in the list and performs the following steps:
a. Use filter() to extract only the digits from the string.
b. Use join() to concatenate the digits into a single string.
c. Use int() to convert the resulting string of digits to an integer.
d. Return the integer as the sorting key. - Assign the sorted list to the variable sorted_list.
- Print the sorted list using the print() function.
Python3
#Initailizing the list test_list = [ "Gfg34" , "is67" , "be3st" , "f23or" , "ge9eks" ] #printing original list before sorting print ( "The original list is:" ,test_list) #sorting the list using the isdigit() method sorted_list = sorted (test_list, key = lambda x: int (''.join( filter ( str .isdigit, x)))) #printing the result. MB print ( "List after numeric sort is:" ,sorted_list) |
The original list is: ['Gfg34', 'is67', 'be3st', 'f23or', 'ge9eks'] List after numeric sort is: ['be3st', 'ge9eks', 'f23or', 'Gfg34', 'is67']
Time Complexity : O(NlogN)
Auxiliary Space : O(N)