31
votes

I am trying to sort list of strings containing numbers

a = ["1099.0","9049.0"]
a.sort()
a
['1099.0', '9049.0']

b = ["949.0","1099.0"]
b.sort()    

b
['1099.0', '949.0']

a
['1099.0', '9049.0']

But list b is sorting and not list a

4
a is already sorted. 1 is smaller that 9. - Felix Kling
I want larger number to be at index 0 always and smaller number at index 0 - Vaibhav Jain
Possible duplicate of How to sort a list numerically? - Georgy

4 Answers

81
votes

You want to sort based on the float values (not string values), so try:

>>> b = ["949.0","1099.0"]
>>> b.sort(key=float)
>>> b
['949.0', '1099.0']
18
votes

use a lambda inside sort to convert them to float and then sort properly:

a = sorted(a, key=lambda x: float(x))

so you will mantain them as strings but sorted by value and not lexicographically

6
votes

In case anybody is dealing with numbers and extensions such as 0.png, 1.png, 10.png, 2.png... We need to retrieve and sort the characters before the extension since this extension does not let us to convert the names to floats:

myList = sorted(myList, key=lambda x: float(x[:-4]))
2
votes

Convert them to int or float or even decimal (since it has trailing numbers)

>>> b = [float(x) for x in b]
>>> b.sort()
>>> b
[949.0, 1099.0]