The behavior of your sort function is not any of the desirable options.
Moving NaNs to the end is not the widely used Panda style of removing them;
I cannot think of any situation where that behavior would be useful... even
though I've read the Illiad.

Other than wastefully creating an eager list, your filter is the same as I
suggested for the one behavior.

In general, passing a sort function, while powerful, is terrible API design
for the non-experts who are main users of statistics module.

On Thu, Dec 26, 2019, 10:42 PM Marco Sulla via Python-ideas <
python-ideas@python.org> wrote:

> Oh my... Mertz, listen to me, you don't need a parameter. You only need a
> key function to pass to `sorted()`
>
> If you use this key function:
>
> https://mail.python.org/archives/list/python-ideas@python.org/message/M3DEOZLA63Z5OIF6H6ZCEXK36GQMLVVA/
>
> in my median() function:
>
> https://mail.python.org/archives/list/python-ideas@python.org/message/KN6BSMJRVCPSQW32DTWQHTGZ5E3E5KK2/
>
> you can simply do:
>
> ```
> median(iterable, key=iliadSort)
> ```
>
> and you have "poisoned" your data.
>
> If you want to use the sorted iterable again later in the code, you can
> just do:
>
> ```
> sorted_it = sorted(iterable, key=iliadSort)
> median(sorted_it, sort_fn=None)
> ```
>
> I prefer this approach, since this way you can avoid potentially
> re-sorting of your data.
>
> For the same reason, if you want to remove the NaNs, it's better to create
> an iterable apart instead of creating it on the fly, because you can
> reutilize it:
>
> ```
> filtered_it = [x for x in iterable if not math.isnan(x)]
> median(filtered_it)
> ```
>
> If you want to raise an error, you can use another key function:
>
> ```
> class NanError(ValueError):
>     pass
>
> def alertNan(x):
>     if math.isnan(x):
>         raise NanError("There a NaN in my dish!")
>
>     return x
>
> ```
>
> and then use it:
>
> ```
> median(iterable, key=alertNan)
> ```
>
> But if you  absolutely want a nan parameter, you can create a wrapper for
> `sorted`:
>
> ```
> def nansorted(iterable, on_nan="poison", **kwargs):
>     if on_nan == "poison":
>         return sorted(iterable, key=iliadSort, **kwargs)
>
>     if on_nan == "remove":
>         new_iterable = [x for x in iterable if not math.isnan(x)]
>         return sorted(new_iterable, **kwargs)
>
>     if on_nan == "raise":
>         return sorted(iterable, key=alertNan, **kwargs)
>
>     raise ValueError(f"Unsupported on_nan parameter value: {on_nan}")
> ```
>
> and then use it in my `median()`:
>
> ```
> median(iterable, sort_fn=nansorted, on_nan="raise")
> ```
>
> or, as before
>
> ```
> sorted_it = nansorted(iterable, on_nan="poison")
> median(sorted_it, sort_fn=None)
> ```
>
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/N5DVTGZR6KS3II5ORTGKGEMPS6JP52AH/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to