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


10

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 fooavec é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

1
Parce que énumérer n'accède pas à un index. Il n'y a pas de concept «énumérable» en python, il est simplement itérable
juanpa.arrivillaga

Réponses:


6

Python n'autorise ces choses que si la classe a des méthodes pour elles:

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__.


1

C'est le résultat d' fooêtre itérable, mais de ne pas avoir de __getitem__fonction. Vous pouvez utiliser itertools.isslicepour 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)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.