Le dim. 3 oct. 2021 à 16:21, <python-ideas-requ...@python.org> a écrit :
> Date: Mon, 4 Oct 2021 01:03:34 +1100
> From: Steven D'Aprano <st...@pearwood.info>
> Subject: [Python-ideas] Re: Feature request enumerate_with_rest or
>         enumerate with skip or filter callback
> To: python-ideas@python.org
> Message-ID: <20211003140333.gr16...@ando.pearwood.info>
> Content-Type: text/plain; charset=us-ascii
>
> Hi Laurent,
Hello Steve,
> It is not clear to me what you mean by "filter by indices".
>
> On Sat, Oct 02, 2021 at 10:25:05PM +0200, Laurent Lyaudet wrote:
>
> > The idea is to filter a list by indices :
> [...]
> > Since filter() returns an iterator instead of a list, it could do what
> > is needed... if the callback had access to the index like the
> > Javascript array filter function.
>
> Do you mean this?
>
> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

Yes exactly,

> You shouldn't assume we are all experts on Javascript :-)
>
No problem, I'll give more links next time :)
> If that is what you want, it is easy to get access to the index. We can
> just do:
>
>     filter(function, enumerate(items))
>
That's exactly what I proposed. Except for the fact that I incorrectly
permuted the two arguments of filter.
I quote my second email :
Le sam. 2 oct. 2021 à 22:35, <python-ideas-requ...@python.org> a écrit :
> Date: Sat, 2 Oct 2021 22:25:05 +0200
> From: Laurent Lyaudet <laurent.lyau...@gmail.com>
>...
> Currently, the following solution is available :
> filter(enumerate(my_list), lambda x: x[0] != i)
> But it is slightly ugly and unefficient to have two function calls for
> such a simple task I think.
I feel uncomfortable because it is often the case that I write
explicitly something,
and I get an answer as if the person answered without reading all my
email or reading another version.

> If you want something else, I'm afraid you will have to explain in more
> detail what you want, sorry.

Again for my second email, I would like one of these 3 options.
> What would be your prefered way of doing this ?
> enumerate(my_list, filter_callback=(lambda x: x != i))
> filter_by_index(my_list, lambda x: x != i)
> # à la JS
> filter(my_list, lambda _, x: x != i)
filter_by_index(lambda x: x != i, my_list)
could be defined as follow (I permuted args to have similar order to
python's filter()):
def filter_by_index(function, my_list):
    for i, item in enumerate(my_list)
        if function(i):
            yield item
like filter is just (without the case function=None)
filter(function, my_list):
    for i, item in enumerate(my_list)
        if function(item):
            yield item
The problem is not that it is hard to code in Python.
The problem is that it is a basic building block for an iterators
tools library like itertools.

enumerate(my_list, filter_callback=(lambda x: x != i))
could be defined in a similar way but there are two variants.
It just needs to return one of the two indices of the item:
- either the index of the item in the original sequence,
- or the index of the item in the filtered sequence (new counter).
For my use case, I do not need the index so I have no argument in
favor of either one of the two indices.

> # à la JS
> filter(my_list, lambda _, x: x != i)
You provided the link from MDN and an helper function for that.
The lambda takes 2 or 3 parameters: item, index, array/list/sequence
and returns true for item that must be output.
I see nothing more to say.

Best regards,
     Laurent Lyaudet
_______________________________________________
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/VBRVBGN5EFFM7F2NWYTNYRMPDO2IN32R/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to