sorting strings numerically while dealing with missing values
Peter Otten
__peter__ at web.de
Wed Dec 28 15:39:20 EST 2016
Larry Martell wrote:
> I have a list containing a list of strings that I want to sort
> numerically by one of the fields. I am doing this:
>
> sorted(rows, key=float(itemgetter(sortby)))
>
> Which works fine as long as all the sort keys convert to a float.
No, that cannot work; unless you have redefined float() you 'l get a
TypeError either here
>>> from operator import itemgetter
>>> float(itemgetter(42))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: float() argument must be a string or a number, not
'operator.itemgetter'
or here:
>>> sorted("abc", key=3.0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'float' object is not callable
> Problem is that some are blank or None and those throw an exception.
> How can I handle that case and still sort? I'd want the blank or None
> fields to come out either at the beginning or end of the sorted list
> (not sure what the customer wants for this yet).
Make the key function return a tuple:
>>> def none_blank_float(value):
... if value is None: return (0,)
... if not value: return (1,)
... return 2, float(value)
...
>>> sorted(["1", "10", "2", None, "3", "", "5"], key=none_blank_float)
[None, '', '1', '2', '3', '5', '10']
More information about the Python-list
mailing list