¿El objeto es enumerable pero no indexable?

10

Resumen del problema y pregunta

Estoy tratando de ver algunos de los datos dentro de un objeto que se pueden enumerar pero no indexar. Todavía soy nuevo en Python, pero no entiendo cómo esto es posible.

Si puede enumerarlo, ¿por qué no puede acceder al índice de la misma manera que lo hace enumerar? Y si no, ¿hay alguna forma de acceder a los elementos individualmente?

El ejemplo real

import tensorflow_datasets as tfds

train_validation_split = tfds.Split.TRAIN.subsplit([6, 4])

(train_data, validation_data), test_data = tfds.load(
    name="imdb_reviews", 
    split=(train_validation_split, tfds.Split.TEST),
    as_supervised=True)

Tomar un subconjunto selecto del conjunto de datos

foo = train_data.take(5)

Yo puedo iterar sobre foola enumeración:

[In] for i, x in enumerate(foo):
    print(i)

que genera el resultado esperado:

0
1
2
3
4

Pero luego, cuando intento indexarlo, foo[0]aparece este error:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-44-2acbea6d9862> in <module>
----> 1 foo[0]

TypeError: 'TakeDataset' object does not support indexing
Phillip Geltman
fuente
1
Porque enumerate no accede a un índice. No existe el concepto de "numerable" en Python, que no es más que iterables
juanpa.arrivillaga

Respuestas:

6

Python solo permite estas cosas si la clase tiene métodos para ellas:

Cualquier clase puede definir una sin definir la otra. __getattr__generalmente no se define si sería ineficiente.


__next__Se requiere 1 en la clase devuelta por __iter__.

Anónimo
fuente
1

Este es el resultado de fooser iterable, pero no tener una __getitem__función. Puede usar itertools.isslicepara obtener el enésimo elemento de un iterable como este

import itertools

def nth(iterable, n, default=None):
    "Returns the nth item or a default value"
    return next(itertools.islice(iterable, n, None), default)
kopecs
fuente