Skip to content Skip to sidebar Skip to footer

Sorting List In Python

if I have a list of strings e.g. ['a143.txt', 'a9.txt', ] how can I sort it in ascending order by the numbers in the list, rather than by the string. I.e. I want 'a9.txt' to appea

Solution 1:

It's called "natural sort order", From http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html

Try this:

import re 

defsort_nicely( l ): 
  """ Sort the given list in the way that humans expect. 
  """ 
  convert = lambda text: int(text) if text.isdigit() else text 
  alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] 
  l.sort( key=alphanum_key ) 

Solution 2:

Use list.sort() and provide your own function for the key argument. Your function will be called for each item in the list (and passed the item), and is expected to return a version of that item that will be sorted.

See http://wiki.python.org/moin/HowTo/Sorting/#Key_Functions for more information.

Solution 3:

If you want to completely disregard the strings, then you should do

import re
numre = re.compile('[0-9]+')
defextractNum(s):
    returnint(numre.search(s).group())

myList = ["a143.txt", "a9.txt", ]
myList.sort(key=extractNum)

Solution 4:

>>> paths = ["a143.txt", "a9.txt"]
>>> sorted(paths, key=lambda s: int(re.search("\d+", s).group()))
['a9.txt', 'a143.txt']

More generic, if you want it to work also for files like: a100_32_12 (and sorting by numeric groups):

>>> paths = ["a143_2.txt", "a143_1.txt"]
>>> sorted(paths, key=lambda s: map(int, re.findall("\d+", s)))
['a143_1.txt', 'a143_1.txt']

Solution 5:

list.sort() is deprecated (see Python.org How-To) . sorted(list, key=keyfunc) is better.

import re

defsortFunc(item):
  returnint(re.search(r'[a-zA-Z](\d+)', item).group(1))

myList = ["a143.txt", "a9.txt"]

printsorted(myList, key=sortFunc)

Post a Comment for "Sorting List In Python"