first()
https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.first
https://toolz.readthedocs.io/en/latest/api.html#toolz.itertoolz.first

last()
https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.last
https://toolz.readthedocs.io/en/latest/api.html#toolz.itertoolz.last

take()
https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.take
https://toolz.readthedocs.io/en/latest/api.html#toolz.itertoolz.take

tail()
https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.tail
https://toolz.readthedocs.io/en/latest/api.html#toolz.itertoolz.tail

... pluck(ind, seqs, default='__no__default__')
> plucks an element or several elements from each item in a sequence.
https://toolz.readthedocs.io/en/latest/api.html#toolz.itertoolz.pluck

On Sat, Aug 1, 2020, 4:59 PM Guido van Rossum <gu...@python.org> wrote:

> Yeah, it is totally doable to refactor the collection ABCs to have
> something in between `Collection` and `Sequence` that just supports
> `__getitem__`.
>
> But I would take Marco's research (and Inada's musings) seriously -- we
> don't actually want to support `__getitem__`, because of the unpredictable
> performance characteristics.
>
> I'm no longer in favor of adding .ordered() -- I think it's better to add
> something to itertools, for example first() to get the first item (see Tim
> Peters' post), and something related to get the first N items.
>
> On Sat, Aug 1, 2020 at 12:28 PM Christopher Barker <python...@gmail.com>
> wrote:
>
>> On Fri, Jul 31, 2020 at 7:34 AM Guido van Rossum <gu...@python.org>
>> wrote:
>>
>>> So maybe we need to add dict.ordered() which returns a view on the items
>>> that is a Sequence rather than a set? Or ordereditems(), orderedkeys() and
>>> orderedvalues()?
>>>
>>
>> I'm still confused as to when "ordered" became synonymous with "Sequence"
>> -- so wouldn't we want to call these dict.as_sequence() or something like
>> that?
>>
>> And is there a reason that the regular dict views couldn't be both a Set
>> and a Sequence? Looking at the ABCs, I don't see a conflict -- __getitem__,
>> index() and count() would need to be added, and  Set's don't have any of
>> those. (and count could be optimized to always return 0 or 1 for
>> dict.keys() ;-) )
>>
>> But anyway, naming aside, I'm still wondering whether we necessarily want
>> the entire Sequence protocol. For the use cases at hand, isn't indexing and
>> slicing enough?
>>
>> Which brings us to the philosophy of duck typing. I wrote an earlier post
>> about that -- so here's some follow up thoughts. I suggested that I like
>> the "if I only need it to quack, I don't care if it's a duck" approach -- I
>> try to use the quack() method, and I'm happy it if works, and raise an
>> Exception (Or let whatever Exception happens be raised bubble up) if it
>> doesn't.
>>
>> Guido pointed out that having a quack() method isn't enough -- it also
>> needs to actually behave as you expect -- which is the nice thing about
>> ABCs -- if you know something is a Sequence, you don't just know that you
>> can index it, you know that indexing it will do what you expect.
>>
>> Which brings us back to the random.choice() function. It's really simple,
>> and uses exactly the approach I outlined above.
>>
>>     def choice(self, seq):
>>         """Choose a random element from a non-empty sequence."""
>>         try:
>>             i = self._randbelow(len(seq))
>>         except ValueError:
>>             raise IndexError('Cannot choose from an empty sequence') from
>> None
>>         return seq[i]
>>
>> It checks the length of the object, picks a random index within that
>> length, and then tries to use that index to get a random item. so anything
>> with a __len__ and a __getitem__ that accepts integers will work.
>>
>> And this has worked "fine" for decades. Should it be checking that seq is
>> actually a sequence? I don't think so -- I like that I can pass in any
>> object that's indexable by an integer.
>>
>> But there's is a potential problem here -- all it does is try to pass an
>> integer to __getitem__. So all Sequences should work. But Mappings also
>> have a __getitem__, but with slightly different semantics -- a Sequence
>> should accept an integer (or object with an __index__) in the range of its
>> size, but a Mapping can accept any valid key. So for the most part, passing
>> a Mapping to random.choice() fails as it should, with a KeyError. But if
>> you happen to have a key that is an integer, it might succeed, but it would
>> not be doing "the right thing" (unless the Mapping happened to be
>> constructed exactly the right way -- but then it should probably just be a
>> Sequence).
>>
>> So: do we need a solution to this? I don't think so, it's simply the
>> nature of a dynamic typing as far as I'm concerned, but if we wanted it to
>> be more robust, we could require (maybe only with a static type
>> declaration) that the object passed in is a Sequence.
>>
>> But I think that would be a shame -- this function doesn't need a full
>> Sequence, it only needs a Sized and __getitem__.
>>
>> In fact, the ABCs are designed to accommodate much of this -- for
>> example, the Sized ABC only requires one feature: __len__. And Contains
>> only __contains__. As far as I know there are no built-ins (or commonly
>> used third party) objects that are ONLY Sized, or ONLY Contains. In fact,
>> at least in the collection.abc, every ABC that has __contains__ also has
>> __len__. And I can't think of anything that could support "in" that didn't
>> have a size -- which could be a failure of imagination on my part. But you
>> could type check for Contains is all you wanted to do was know that you
>> could use it with "in".
>>
>> So there are ABCs there simply to support a single method. Which means
>> that we could solve the "problem" of random.choice with a "Getitemable"
>> ABC.
>>
>> Ahh -- but here's the rub -- while the ABCs only require certain methods
>> -- in fact, it's implied that they have particular behavior as well. And
>> this is the problem at hand. Both Sequences and Mappings have a
>> __getitem__, but they have somewhat different meanings, and that meaning is
>> embedded in the ABC itself, rather than the method: Sequences will take an
>> integer, and raise a IndexError if its out of range, and Mappings take any
>> hashable, and will raise a KeyError if it's not there.
>>
>> So maybe what is needed is an Indexable ABC that implies the
>> Sequence-like indexing behavior.
>>
>> Then if we added indexing to dict views, they would be an Indexable, but
>> not a Sequence.
>>
>> -CHB
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>> On Fri, Jul 31, 2020 at 05:29 Ricky Teachey <ri...@teachey.org> wrote:
>>>
>>>> On Fri, Jul 31, 2020, 2:48 AM Wes Turner <wes.tur...@gmail.com> wrote:
>>>>
>>>>> # Dicts and DataFrames
>>>>> - Src:
>>>>> https://github.com/westurner/pythondictsanddataframes/blob/master/dicts_and_dataframes.ipynb
>>>>> - Binder:
>>>>> https://mybinder.org/v2/gh/westurner/pythondictsanddataframes/master?filepath=dicts_and_dataframes.ipynb
>>>>>   - (interactive Jupyter Notebook hosted by https://mybinder.org/ )
>>>>>
>>>>
>>>> The punchline of Wes Turner's notebook (very well put together, thank
>>>> you!) seems to partly be that if you find yourself wanting to work with the
>>>> position of items in a dict, you might want to consider using a
>>>> pandas.Series (with it's .iloc method).
>>>>
>>>> A difficulty that immediately came to mind with this advice is type
>>>> hinting support. I was just googling yesterday for "how to type hint using
>>>> pandas" and the only thing I found is to use pd.Series and pd.DataFrame
>>>> directly.
>>>>
>>>> But those don't support type hinting comparable to:
>>>>
>>>> Dict[str, float]
>>>>
>>>> Or:
>>>>
>>>> class Vector(TypedDict):
>>>>     i: float
>>>>     j: float
>>>>
>>>> This is a big downside of the advice "just use pandas". Although I love
>>>> using pandas and use it all the time.
>>>> _______________________________________________
>>>> 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/C7HJFKB67U74SULO6OUTLWST2MHZERCH/
>>>> Code of Conduct: http://python.org/psf/codeofconduct/
>>>>
>>> --
>>> --Guido (mobile)
>>> _______________________________________________
>>> 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/VIPBHJTMFGREFQHINDNODAAJGNE2IDJB/
>>> Code of Conduct: http://python.org/psf/codeofconduct/
>>>
>>
>>
>> --
>> Christopher Barker, PhD
>>
>> Python Language Consulting
>>   - Teaching
>>   - Scientific Software Development
>>   - Desktop GUI and Web Development
>>   - wxPython, numpy, scipy, Cython
>>
>
>
> --
> --Guido van Rossum (python.org/~guido)
> *Pronouns: he/him **(why is my pronoun here?)*
> <http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/>
> _______________________________________________
> 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/PIYAZOAKRIJBT5O5BGCFZDBALGTGUPNG/
> Code of Conduct: http://python.org/psf/codeofconduct/
>
_______________________________________________
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/V5757F4J3SZ7EDSODPDZENYWFZNAUXMS/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to