Résumé du problème et question
J'essaie de regarder certaines des données à l'intérieur d'un objet qui peuvent être énumérées mais non indexées. Je suis encore novice en python, mais je ne comprends pas comment cela est possible.
Si vous pouvez l'énumérer, pourquoi ne pouvez-vous pas accéder à l'index de la même manière que l'énumérer? Et sinon, existe-t-il un moyen d'accéder aux éléments individuellement?
L'exemple réel
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)
Prendre un sous-ensemble sélectionné de l'ensemble de données
foo = train_data.take(5)
Je peux répéter foo
avec énumérer:
[In] for i, x in enumerate(foo):
print(i)
qui génère la sortie attendue:
0
1
2
3
4
Mais alors, quand j'essaie de l'indexer, foo[0]
j'obtiens cette erreur:
---------------------------------------------------------------------------
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
la source
la source
Réponses:
Python n'autorise ces choses que si la classe a des méthodes pour elles:
__getitem__
est requis pour la[]
syntaxe.__iter__
et 1__next__
sont nécessaires pour itérer.Toute classe peut en définir un sans définir l'autre.
__getattr__
n'est généralement pas défini s'il serait inefficace.1
__next__
est requis sur la classe retournée par__iter__
.la source
C'est le résultat d'
foo
être itérable, mais de ne pas avoir de__getitem__
fonction. Vous pouvez utiliseritertools.isslice
pour obtenir le nième élément d'un itérable comme çala source
En Python, les instances de classes personnalisées peuvent implémenter l'énumération via une
__iter__
méthode spéciale (ou "dunder") . Peut-être que cette classe implémente__iter__
mais pas__getitem__
.Présentation de Dunder: https://dbader.org/blog/python-dunder-methods
Spécifications pour une
__iter__
méthode: https://docs.python.org/3/library/stdtypes.html#typeiterla source