mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-27 15:01:08 +00:00
Create natural_sort.py (#3286)
* add natural_sort.py * fix doctest * add 're' to requirements.txt and fix spelling errors * delete 're' from requirements.txt * fixing linting errors * Update sorts/natural_sort.py Co-authored-by: Christian Clauss <cclauss@me.com> * Update sorts/natural_sort.py Co-authored-by: Christian Clauss <cclauss@me.com> * Update natural_sort.py Co-authored-by: Christian Clauss <cclauss@me.com>
This commit is contained in:
parent
7c5cc28ba2
commit
f0033f87e0
36
sorts/natural_sort.py
Normal file
36
sorts/natural_sort.py
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
def natural_sort(input_list: list[str]) -> list[str]:
|
||||||
|
"""
|
||||||
|
Sort the given list of strings in the way that humans expect.
|
||||||
|
|
||||||
|
The normal Python sort algorithm sorts lexicographically,
|
||||||
|
so you might not get the results that you expect...
|
||||||
|
|
||||||
|
>>> example1 = ['2 ft 7 in', '1 ft 5 in', '10 ft 2 in', '2 ft 11 in', '7 ft 6 in']
|
||||||
|
>>> sorted(example1)
|
||||||
|
['1 ft 5 in', '10 ft 2 in', '2 ft 11 in', '2 ft 7 in', '7 ft 6 in']
|
||||||
|
>>> # The natural sort algorithm sort based on meaning and not computer code point.
|
||||||
|
>>> natural_sort(example1)
|
||||||
|
['1 ft 5 in', '2 ft 7 in', '2 ft 11 in', '7 ft 6 in', '10 ft 2 in']
|
||||||
|
|
||||||
|
>>> example2 = ['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9']
|
||||||
|
>>> sorted(example2)
|
||||||
|
['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9']
|
||||||
|
>>> natural_sort(example2)
|
||||||
|
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']
|
||||||
|
"""
|
||||||
|
|
||||||
|
def alphanum_key(key):
|
||||||
|
return [int(s) if s.isdigit() else s.lower() for s in re.split("([0-9]+)", key)]
|
||||||
|
|
||||||
|
return sorted(input_list, key=alphanum_key)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import doctest
|
||||||
|
|
||||||
|
doctest.testmod()
|
Loading…
Reference in New Issue
Block a user