User Tools

Site Tools


python:database:sqlite:how_to_natural_sort

Differences

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

Link to this comparison view

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