Sort Results Non-lexicographically?
Solution 1:
1 - Install natsort module
pip install natsort
2 - Import natsorted
>>> input = ['1', '10', '2', '0', '3', 'Hello', '100', 'Allowance']
>>> from natsort import natsorted
>>> natsorted(input)
['0', '1', '2', '3', '10', '100', 'Allowance', 'Hello']
Source: https://pypi.python.org/pypi/natsort
Solution 2:
I have found the code in the following link about natural sorting order very useful in the past:
http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html
Solution 3:
This will do it. For purposes of comparison, it converts strings that can be converted to an integer to that integer, and leaves other strings alone:
defkey(s):
try:
returnint(s)
except ValueError:
return s
sorted_input = sorted(input, key=key)
Solution 4:
You could split up the list, sort, then put it back together. Try something like this:
numbers = sorted(int(i) for i in input_ if i.isdigit())
nonnums = sorted(i for i in input_ if not i.isdigit())
sorted_input = [str(i) for i in numbers] + nonnums
You'll have to do something more complicated than isdigit
if you can have non-integers.
If this doesn't cover your "some are a combination of the two," please elaborate what that means and what output you expect from them.
(Not tested, but should convey the idea.)
Solution 5:
For your specific case:
defmySort(l):
numbers = []
words = []
for e in l:
try:
numbers.append(int(e))
except:
words.append(e)
return [str(i) for i insorted(numbers)] + sorted(words)
print mySort(input)
Post a Comment for "Sort Results Non-lexicographically?"