14

I have a list that consists of details like this:

list1 = ["1", "100A", "342B", "2C", "132", "36", "302F"]

I want to sort this list, such that the values are in the following order:

list1 = ["1", "2C", "36", "100A", "132", "302F", "342B"]

Just doing list1.sort() obviously doesn't give the correct answer - it gives:

list1 = ["1", "100A", "132", "2C", "36", "302F", "342B"]

I'm assuming this is because Python treats all these as strings directly. However, I want to sort them based on their numeric value FIRST, and then the character that follows the number.

How do I proceed?

2

2 Answers 2

30

You want to use natural sort:

import re

_nsre = re.compile('([0-9]+)')
def natural_sort_key(s):
    return [int(text) if text.isdigit() else text.lower()
            for text in re.split(_nsre, s)]   

Example usage:

>>> list1 = ["1", "100A", "342B", "2C", "132", "36", "302F"]
>>> list1.sort(key=natural_sort_key)
>>> list1
['1', '2C', '36', '100A', '132', '302F', '342B']

This functions by splitting the elements into lists separating out the numbers and comparing them as integers instead of strings:

>>> natural_sort_key("100A")
['', 100, 'a']
>>> natural_sort_key("342B")
['', 342, 'b']

Note that this only works in Python3 if you are always comparing ints with ints and strings with strings, otherwise you get a TypeError: unorderable types exception.

Sign up to request clarification or add additional context in comments.

2 Comments

Note that for Python 3 all items must have a similar structure. ['a1', '2b'] would fail with a TypeError.
@StevenRumbalski: ah i forgot about that, thanks. I'll mention it.
0

Well, you have to find a way to convert your strings to numbers first. For example

import re
def convert(str):
    return int("".join(re.findall("\d*", str)))

and then you use it as a sort key:

list1.sort(key=convert)

1 Comment

There are some more natural sort solutions here: stackoverflow.com/questions/4836710/…

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.