Given a list containing both alphanumeric values, write a Python program to sort the given list in such a way that the alphabetical values always comes after numeric values. Examples:
Input : ['k', 5, 'e', 3, 'g', 7, 0, 't'] Output : [0, 3, 5, 7, 'e', 'g', 'k', 't'] Input : [1, 'c', 3, 2, 'a', 'b'] Output : [1, 2, 3, 'a', 'b', 'c']
Approach 1 : Using sort() method To use Python sort() method we need to convert all list values to str type first. Now there are two methods to convert values to string.
- Method #1 : List comprehension Python list comprehension can be simply used to convert each element of list to string type. We sort it and since all values are now str type, we change the final list to back to its original form.
Python3
# Python3 program to Sort list # containing alpha and numeric values def sort(lst): lst = [ str (i) for i in lst] lst.sort() lst = [ int (i) if i.isdigit() else i for i in lst ] return lst # Driver code lst = [ 'k' , 5 , 'e' , 3 , 'g' , 7 , 0 , 't' ] print (sort(lst)) |
[0, 3, 5, 7, 'e', 'g', 'k', 't']
- Method #2 : Using key function Key function serves as a key for the sort comparison, which is equal to str in our case.
Python3
# Python3 program to Sort list # containing alpha and numeric values def sort(lst): lst.sort(key = str ) return lst # Driver code lst = [ 'k' , 5 , 'e' , 3 , 'g' , 7 , 0 , 't' ] print (sort(lst)) |
[0, 3, 5, 7, 'e', 'g', 'k', 't']
Approach 2 : sorted() Alternatively, you can also use Python’s in-built function sorted() for the same purpose. Simplest difference between sort() and sorted() is: sort() doesn’t return any value while, sorted() returns an iterable list. Now there are again two ways of using sorted().
- Method #1 : Using key function
Python3
# Python3 program to Sort list # containing alpha and numeric values def sort(lst): return sorted (lst, key = str ) # Driver code lst = [ 'k' , 5 , 'e' , 3 , 'g' , 7 , 0 , 't' ] print (sort(lst)) |
[0, 3, 5, 7, 'e', 'g', 'k', 't']
- Method #2 : lambda
Python3
# Python3 program to Sort list # containing alpha and numeric values def sort(lst): return sorted (lst, key = lambda x: ( isinstance (x, str ), x)) # Driver code lst = [ 'k' , 5 , 'e' , 3 , 'g' , 7 , 0 , 't' ] print (sort(lst)) |
[0, 3, 5, 7, 'e', 'g', 'k', 't']
Approach#3:Using two lists and concatenation
Algorithm
1. Create two new lists: one for integers and one for strings.
2. Iterate through the original list.
3. For each element in the original list, check if it is a string or integer.
4. If it is a string, append it to the string list.
5. If it is an integer, append it to the integer list.
6. Sort both the integer and string lists.
7. Concatenate the integer and string lists together to create the final result list.
8. Return the final result list.
Python3
def sort_alphanumeric(input_list): int_list = [] str_list = [] for i in input_list: if isinstance (i, str ): str_list.append(i) else : int_list.append(i) int_list = sorted (int_list) str_list = sorted (str_list) result_list = int_list + str_list return result_list input_list = [ 'k' , 5 , 'e' , 3 , 'g' , 7 , 0 , 't' ] print (sort_alphanumeric(input_list)) |
[0, 3, 5, 7, 'e', 'g', 'k', 't']
Time Complexity: O(n log n) for the sorted() function.
Space Complexity: O(n) for the int_list and str_list.
Approach#4: Using numpy
Algorithm:
Convert the input list to a numpy array using np.array() function.
Create a boolean mask array which checks whether each element of the array is of str or int type using np.char.isnumeric() function and logical not operator.
Sort the two subcontaining non-numeric elements, using np.sort() function.
Concatenate the two sorted sub-arrays using np.concatenate() function to obtain the final sorted array.
Convert the final sorted array to list using tolist() method.
Approach#4: Using Regular Expression
Algorithm
Create two empty lists, one for integers and one for strings.
Iterate through the original list.
Convert each element to a string using str().
Use regular expressions to check if the string matches a pattern for integer or string.
If the string matches the integer pattern, append it to the integer list.
If the string matches the string pattern, append it to the string list.
Sort both the integer and string lists.
Concatenate the integer and string lists together to create the final result list.
Return the final result list.
Python3
#Python3 import re def sort_alphanumeric(input_list): int_list = [] str_list = [] for i in input_list: s = str (i) if re.match(r '^\d+$' , s): int_list.append( int (s)) else : str_list.append(s) int_list = sorted (int_list) str_list = sorted (str_list) result_list = int_list + str_list return result_list input_list = [ 'k' , 5 , 'e' , 3 , 'g' , 7 , 0 , 't' ] print (sort_alphanumeric(input_list)) |
[0, 3, 5, 7, 'e', 'g', 'k', 't']
Time Complexity: O(n log n) for the sorted() function.
Auxiliary Space: O(n) for the int_list and str_list.