python:database:sqlite:how_to_natural_sort

This shows you the differences between two versions of the page.

Both sides previous revision Previous revision | |||

python:database:sqlite:how_to_natural_sort [2016/01/07 14:28] ozan |
python:database:sqlite:how_to_natural_sort [2016/06/18 09:23] (current) ozan |
||
---|---|---|---|

Line 62: | Line 62: | ||

# [(None,), (u'A-0',), (u'A-01',), (u'A-2',), (u'A-02',), (u'a-010',)] | # [(None,), (u'A-0',), (u'A-01',), (u'A-2',), (u'A-02',), (u'a-010',)] | ||

</code> | </code> | ||

- | {{tag>python natural_sort_order alphabetical_order human_sort natsort sqlite sqlite3}} | + | |

+ | My second method is to use an alphanumeric comparison algorithm for natural sorting. [[http://www.davekoelle.com/alphanum.html|Dave Koelle]] has coded this for various programming languages. Implementation in SQLite is simple and python code for The Alphanum Algorithm is as below. | ||

+ | <code python> | ||

+ | ... | ||

+ | con.create_collation("naturalsort", alphanum) | ||

+ | ... | ||

+ | </code> | ||

+ | | ||

+ | <code python> | ||

+ | # | ||

+ | # The Alphanum Algorithm is an improved sorting algorithm for strings | ||

+ | # containing numbers. Instead of sorting numbers in ASCII order like | ||

+ | # a standard sort, this algorithm sorts numbers in numeric order. | ||

+ | # | ||

+ | # The Alphanum Algorithm is discussed at http://www.DaveKoelle.com | ||

+ | # | ||

+ | #* Python implementation provided by Chris Hulan ([email protected]) | ||

+ | #* Distributed under same license as original | ||

+ | # | ||

+ | # This library is free software; you can redistribute it and/or | ||

+ | # modify it under the terms of the GNU Lesser General Public | ||

+ | # License as published by the Free Software Foundation; either | ||

+ | # version 2.1 of the License, or any later version. | ||

+ | # | ||

+ | # This library is distributed in the hope that it will be useful, | ||

+ | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||

+ | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||

+ | # Lesser General Public License for more details. | ||

+ | # | ||

+ | # You should have received a copy of the GNU Lesser General Public | ||

+ | # License along with this library; if not, write to the Free Software | ||

+ | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||

+ | # | ||

+ | | ||

+ | import re | ||

+ | | ||

+ | # | ||

+ | # TODO: Make decimal points be considered in the same class as digits | ||

+ | # | ||

+ | | ||

+ | def chunkify(str): | ||

+ | """return a list of numbers and non-numeric substrings of +str+ | ||

+ | | ||

+ | the numeric substrings are converted to integer, non-numeric are left as is | ||

+ | """ | ||

+ | chunks = re.findall("(\d+|\D+)",str) | ||

+ | chunks = [re.match('\d',x) and int(x) or x for x in chunks] #convert numeric strings to numbers | ||

+ | return chunks | ||

+ | | ||

+ | def alphanum(a,b): | ||

+ | """breaks +a+ and +b+ into pieces and returns left-to-right comparison of the pieces | ||

+ | | ||

+ | +a+ and +b+ are expected to be strings (for example file names) with numbers and non-numeric characters | ||

+ | Split the values into list of numbers and non numeric sub-strings and so comparison of numbers gives | ||

+ | Numeric sorting, comparison of non-numeric gives Lexicographic order | ||

+ | """ | ||

+ | # split strings into chunks | ||

+ | aChunks = chunkify(a) | ||

+ | bChunks = chunkify(b) | ||

+ | | ||

+ | return cmp(aChunks,bChunks) #built in comparison works once data is prepared | ||

+ | | ||

+ | | ||

+ | | ||

+ | if __name__ == "__main__": | ||

+ | unsorted = ["1000X Radonius Maximus","10X Radonius","200X Radonius","20X Radonius","20X Radonius Prime","30X Radonius","40X Radonius","Allegia 50 Clasteron","Allegia 500 Clasteron","Allegia 51 Clasteron","Allegia 51B Clasteron","Allegia 52 Clasteron","Allegia 60 Clasteron","Alpha 100","Alpha 2","Alpha 200","Alpha 2A","Alpha 2A-8000","Alpha 2A-900","Callisto Morphamax","Callisto Morphamax 500","Callisto Morphamax 5000","Callisto Morphamax 600","Callisto Morphamax 700","Callisto Morphamax 7000","Callisto Morphamax 7000 SE","Callisto Morphamax 7000 SE2","QRS-60 Intrinsia Machine","QRS-60F Intrinsia Machine","QRS-62 Intrinsia Machine","QRS-62F Intrinsia Machine","Xiph Xlater 10000","Xiph Xlater 2000","Xiph Xlater 300","Xiph Xlater 40","Xiph Xlater 5","Xiph Xlater 50","Xiph Xlater 500","Xiph Xlater 5000","Xiph Xlater 58"] | ||

+ | sorted = unsorted[:] | ||

+ | sorted.sort(alphanum) | ||

+ | print '+++++Sorted...++++' | ||

+ | print '\n'.join(sorted) | ||

+ | </code> | ||

+ | | ||

+ | | ||

+ | {{tag>python natural_sort_order alphabetical_order human_sort natsort alphanum_algorithm sqlite sqlite3}} | ||

~~DISCUSSION~~ | ~~DISCUSSION~~ | ||

python/database/sqlite/how_to_natural_sort.txt · Last modified: 2016/06/18 09:23 by ozan