How do you sort alphanumeric values in python?

I have a set

set(['booklet', '4 sheets', '48 sheets', '12 sheets'])

After sorting I want it to look like

4 sheets,
12 sheets,
48 sheets,
booklet

Any idea please

SilentGhost

293k64 gold badges301 silver badges291 bronze badges

asked Apr 19, 2010 at 16:21

Jeff Atwood talks about natural sort and gives an example of one way to do it in Python. Here is my variation on it:

import re 

def sorted_nicely( l ): 
    """ Sort the given iterable 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) ] 
    return sorted(l, key = alphanum_key)

Use like this:

s = set(['booklet', '4 sheets', '48 sheets', '12 sheets'])
for x in sorted_nicely(s):
    print(x)

Output:

4 sheets
12 sheets
48 sheets
booklet

One advantage of this method is that it doesn't just work when the strings are separated by spaces. It will also work for other separators such as the period in version numbers (for example 1.9.1 comes before 1.10.0).

answered Apr 19, 2010 at 16:31

Mark ByersMark Byers

780k183 gold badges1551 silver badges1440 bronze badges

4

Short and sweet:

sorted(data, key=lambda item: (int(item.partition(' ')[0])
                               if item[0].isdigit() else float('inf'), item))

This version:

  • Works in Python 2 and Python 3, because:
    • It does not assume you compare strings and integers (which won't work in Python 3)
    • It doesn't use the cmp parameter to sorted (which doesn't exist in Python 3)
  • Will sort on the string part if the quantities are equal

If you want printed output exactly as described in your example, then:

data = set(['booklet', '4 sheets', '48 sheets', '12 sheets'])
r = sorted(data, key=lambda item: (int(item.partition(' ')[0])
                                   if item[0].isdigit() else float('inf'), item))
print ',\n'.join(r)

answered Apr 19, 2010 at 17:32

Daniel StutzbachDaniel Stutzbach

71.3k17 gold badges85 silver badges76 bronze badges

3

You should check out the third party library natsort. Its algorithm is general so it will work for most input.

>>> import natsort
>>> your_list = set(['booklet', '4 sheets', '48 sheets', '12 sheets'])
>>> print ',\n'.join(natsort.natsorted(your_list))
4 sheets,
12 sheets,
48 sheets,
booklet

answered Jul 17, 2014 at 22:01

SethMMortonSethMMorton

42.4k12 gold badges64 silver badges80 bronze badges

A simple way is to split up the strings to numeric parts and non-numeric parts and use the python tuple sort order to sort the strings.

import re
tokenize = re.compile(r'(\d+)|(\D+)').findall
def natural_sortkey(string):          
    return tuple(int(num) if num else alpha for num, alpha in tokenize(string))

sorted(my_set, key=natural_sortkey)

answered Apr 19, 2010 at 16:37

Ants AasmaAnts Aasma

51.3k15 gold badges88 silver badges92 bronze badges

It was suggested that I repost this answer over here since it works nicely for this case also

from itertools import groupby
def keyfunc(s):
    return [int(''.join(g)) if k else ''.join(g) for k, g in groupby(s, str.isdigit)]

sorted(my_list, key=keyfunc)

Demo:

>>> my_set = {'booklet', '4 sheets', '48 sheets', '12 sheets'}
>>> sorted(my_set, key=keyfunc)
['4 sheets', '12 sheets', '48 sheets', 'booklet']

For Python3 it's necessary to modify it slightly (this version works ok in Python2 too)

def keyfunc(s):
    return [int(''.join(g)) if k else ''.join(g) for k, g in groupby('\0'+s, str.isdigit)]

answered Jun 6, 2013 at 7:35

How do you sort alphanumeric values in python?

John La RooyJohn La Rooy

285k51 gold badges358 silver badges498 bronze badges

Generic answer to sort any numbers in any position in an array of strings. Works with Python 2 & 3.

def alphaNumOrder(string):
   """ Returns all numbers on 5 digits to let sort the string with numeric order.
   Ex: alphaNumOrder("a6b12.125")  ==> "a00006b00012.00125"
   """
   return ''.join([format(int(x), '05d') if x.isdigit()
                   else x for x in re.split(r'(\d+)', string)])

Sample:

s = ['a10b20','a10b1','a3','b1b1','a06b03','a6b2','a6b2c10','a6b2c5']
s.sort(key=alphaNumOrder)
s ===> ['a3', 'a6b2', 'a6b2c5', 'a6b2c10', 'a06b03', 'a10b1', 'a10b20', 'b1b1']

Part of the answer is from there

answered Oct 5, 2016 at 23:23

How do you sort alphanumeric values in python?

Le DroidLe Droid

4,2942 gold badges34 silver badges32 bronze badges

>>> a = set(['booklet', '4 sheets', '48 sheets', '12 sheets'])
>>> def ke(s):
    i, sp, _ = s.partition(' ')
    if i.isnumeric():
        return int(i)
    return float('inf')

>>> sorted(a, key=ke)
['4 sheets', '12 sheets', '48 sheets', 'booklet']

answered Apr 19, 2010 at 16:25

SilentGhostSilentGhost

293k64 gold badges301 silver badges291 bronze badges

Based on SilentGhost's answer:

In [4]: a = set(['booklet', '4 sheets', '48 sheets', '12 sheets'])

In [5]: def f(x):
   ...:     num = x.split(None, 1)[0]
   ...:     if num.isdigit():
   ...:         return int(num)
   ...:     return x
   ...: 

In [6]: sorted(a, key=f)
Out[6]: ['4 sheets', '12 sheets', '48 sheets', 'booklet']

answered Apr 19, 2010 at 16:31

sets are inherently un-ordered. You'll need to create a list with the same content and sort that.

answered Apr 19, 2010 at 16:25

RakisRakis

7,65923 silver badges25 bronze badges

3

For people stuck with a pre-2.4 version of Python, without the wonderful sorted() function, a quick way to sort sets is:

l = list(yourSet)
l.sort() 

This does not answer the specific question above (12 sheets will come before 4 sheets), but it might be useful to people coming from Google.

answered Oct 22, 2013 at 16:11

0

b = set(['booklet', '10-b40', 'z94 boots', '4 sheets', '48 sheets',
         '12 sheets', '1 thing', '4a sheets', '4b sheets', '2temptations'])

numList = sorted([x for x in b if x.split(' ')[0].isdigit()],
                 key=lambda x: int(x.split(' ')[0]))

alphaList = sorted([x for x in b if not x.split(' ')[0].isdigit()])

sortedList = numList + alphaList

print(sortedList)

Out: ['1 thing',
      '4 sheets',
      '12 sheets',
      '48 sheets',
      '10-b40',
      '2temptations',
      '4a sheets',
      '4b sheets',
      'booklet',
      'z94 boots']

answered Apr 1, 2021 at 17:23

tldrtldr

1063 bronze badges

How do you sort alphanumeric numbers?

To sort, highlight both columns and sort on B. If there can be other prefixes, say b-, c-, etc., similarly split off the text portion to another column. Then sort on the text column as the first sort column and the number column as the second. Everything you highlight will get sorted according to the sort columns.

What is alphanumeric sorting?

SORT-TYPES is an alphanumeric property that can be repeated for each column contained in the grid. The value determines the sorting property of the column as shown in the table. Many of these values are similar to those for the DATA-TYPES property.

How do you sort numbers and letters in Python?

Python sorted() Function You can specify ascending or descending order. Strings are sorted alphabetically, and numbers are sorted numerically. Note: You cannot sort a list that contains BOTH string values AND numeric values.

How do you sort numerical data in Python?

Let's discuss ways in which this is performed..
Method #1 : Naive Method. In the naive method requires the type conversion of all the elements into integers of the list iterated through a loop. ... .
Method #2 : Using sort() using key. ... .
Method #3 : Using sorted() + key. ... .
Method #4 : Using sorted() + key with len ().