web-dev-qa-db-fra.com

L'objet est énumérable mais pas indexable?

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)

I peut itérer sur 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'essaye 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
10
Phillip Geltman

Ceci est dû au fait que foo est itérable, mais ne possède pas de __getitem__ fonction. Vous pouvez utiliser itertools.isslice pour obtenir le nième élément d'un itérable comme ça

import itertools

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

En Python, les instances de classes personnalisées peuvent implémenter l'énumération par le biais de spécial (ou "dunder") __iter__ méthode. Peut-être que cette classe implémente __iter__ mais non __getitem__.

Présentation de Dunder: https://dbader.org/blog/python-dunder-methods
Spécifications pour un __iter__ méthode: https://docs.python.org/3/library/stdtypes.html#typeiter

0
Exr0n