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 foo
la 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
python
tensorflow
neural-network
kaggle
Phillip Geltman
fuente
fuente
Respuestas:
Python solo permite estas cosas si la clase tiene métodos para ellas:
__getitem__
se requiere para la[]
sintaxis.__iter__
y 1 son necesarios para iterar.__next__
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__
.fuente
Este es el resultado de
foo
ser iterable, pero no tener una__getitem__
función. Puede usaritertools.isslice
para obtener el enésimo elemento de un iterable como estefuente
En Python, las instancias de clases personalizadas pueden implementar la enumeración a través del
__iter__
método especial (o "dunder") . Quizás esta clase implemente__iter__
pero no__getitem__
.Descripción general de Dunder: https://dbader.org/blog/python-dunder-methods
Especificaciones para un
__iter__
método: https://docs.python.org/3/library/stdtypes.html#typeiterfuente