Package: naturalsort
Thenatsort.natsort()function in thenaturalsortpackage is a very
simple alternative to Python’ssorted()function that implementsnatural
order sortingin Python. The package is available onPyPI, so getting
started is very simple:$ pip install naturalsort
$ python
> from natsort import natsort
> versions = ['1.8.1-r26', '1.8.1-r30', '2.0-r2', '2.0-r7', '2.0-r11']
> natsort(['my-package-%s' % v for v in versions])
['my-package-1.8.1-r26',
 'my-package-1.8.1-r30',
 'my-package-2.0-r2',
 'my-package-2.0-r7',
 'my-package-2.0-r11']UsageHere’s an example of regular sorting (based on theASCIIorder of individual
characters) compared tonatural order sorting:> # Import the sorted() alternative.
> from natsort import natsort
>
> # This is plain old sorting (what we DON'T want).
> sorted(['1', '5', '10', '50'])
['1', '10', '5', '50']
>
> # This is natural order sorting (what we DO want).
> natsort(['1', '5', '10', '50'])
['1', '5', '10', '50']
>
> # natsort() accepts a optional ``reverse`` argument for consistency with
> the built-in sorted() function.
> natsort(['1', '5', '10', '50'], reverse=True)
['50', '10', '5', '1']Custom comparison keysThe main use case that thenaturalsortpackage was originally created for is
sorting of filenames with versions numbers embedded in them. Unfortunately this
won’t always work out of the box; you may need to define a custom comparison
key. Here’s an example where a custom comparison key is required to get the
proper results:> from natsort import natsort
> from pprint import pprint
> versions = ['package-name_1_all.deb',
...           'package-name_1.5_all.deb',
...           'package-name_2_all.deb']This is what happens by default:> pprint(natsort(versions))
['package-name_1.5_all.deb',
 'package-name_1_all.deb',
 'package-name_2_all.deb']Here’s how to get the right results:> from os.path import basename, splitext
> def version_from_fname(filename):
...   filename, extension = splitext(basename(filename))
..    name, version, architecture = filename.split('_')
...   return version
...
> pprint(natsort(versions, key=version_from_fname))
['package-name_1_all.deb',
 'package-name_1.5_all.deb',
 'package-name_2_all.deb']Why another natsort module?!Thenatsortpackage on PyPI is more advanced and configurable than mynaturalsortpackage, so depending on your use case you may prefer to use that
package instead. Here are the differences:Mynaturalsortpackage implements only a small subset of the functionality
of thenatsortpackage, specifically the following calls result in the same
sorting order:naturalsort package:natsort.natsort(['1-1','1-2'])natsort package:natsort.natsorted(['1-1','1-2'],number_type=None)This example shows the different goals of the two packages: Thenaturalsortpackage is intended to sort version numbers while thenatsortpackage by
default interprets dashes as a negative sign and requires the keyword
argumentnumber_type=Noneto disable this behavior.Thenaturalsortpackage works on Python 2.4 and 2.5 while thenatsortpackage requires at least Python 2.6.ContactThe latest version ofnaturalsortis available onPyPIandGitHub. For
bug reports please create an issue onGitHub. If you have questions,
suggestions, etc. feel free to send me an e-mail atpeter@peterodding.com.LicenseThis software is licensed under theMIT license.© 2015 Peter Odding.