Skip to content Skip to sidebar Skip to footer

Sort Results Non-lexicographically?

I'm trying to display some results in a human-readable way. For the purposes of this question, some of them are numbers, some are letters, some are a combination of the two. I'm tr

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?"