On Tue, Oct 5, 2021 at 9:46 AM Erik Demaine <edemaine@mit.edu> wrote:

Of course, the universal way to get the first item from an iterable x is

item = next(iter(x))

I can't say this is particularly readable, but it is functional and fast.

I think we can add `itertools.first()` for this idiom, and `itertools.last()` for `next(iter(reversed(x)))` idiom.

Given the dictionary order guarantee from Python 3.7, adding indexing (__getitem__) to dict views seems natural. The potential catch is that (I think) it would require linear time to access an item in the middle, because you need to count the dummy elements. But accessing [i] and [-i] should be doable in O(|i|) time.

It is not true. They are O(n) where n is the maximum dict size.

Python is also full of operations that take linear time to do: list.insert(0, x), list.pop(0), list.index(), etc. But it may be that __getitem__ takes constant time on all built-in data structures, and the apparent symmetry but very different performance between dict()[i] and list()[i] might be confusing. That said, I really just want d[0] and d[-1], which is when these are fast.

They are not first. Since `next(iter(d))` is O(n), following code is O(n^2) ``` while d: del d[next(iter(d))] ``` Making list is much faster than it. Following code is O(n). ``` for k in list(d): del d[k] ```

I found some related discussion in https://mail.python.org/archives/list/python-ideas@python.org/thread/QVTGZD6... but not this exact idea.

What is difference between your idea and previsous discussion? -- Inada Naoki <songofacandy@gmail.com>