L'oggetto è enumerabile ma non indicizzabile?


10

Riepilogo e domanda del problema

Sto cercando di esaminare alcuni dei dati all'interno di un oggetto che possono essere enumerati ma non indicizzati. Sono ancora una novità per Python, ma non capisco come sia possibile.

Se riesci a enumerarlo, perché non riesci ad accedere all'indice allo stesso modo dell'enumerazione? E se no, c'è un modo per accedere agli oggetti individualmente?

L'esempio reale

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)

Prendi un sottoinsieme selezionato del set di dati

foo = train_data.take(5)

Io posso iterare foocon enumerate:

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

che genera l'output previsto:

0
1
2
3
4

Ma poi, quando provo ad indicizzarlo, foo[0]ottengo questo errore:

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

TypeError: 'TakeDataset' object does not support indexing

1
Perché enumerare non accede a un indice. Non esiste un concetto di "enumerabile" in Python, è semplicemente iterabile
juanpa.arrivillaga,

Risposte:


6

Python consente queste cose solo se la classe ha dei metodi per loro:

Qualsiasi classe può definirne una senza definire l'altra. __getattr__di solito non è definito se sarebbe inefficiente.


1 __next__ è richiesto per la classe restituita da __iter__.


1

Questo è il risultato di fooessere iterabile, ma di non avere una __getitem__funzione. Puoi usare itertools.issliceper ottenere l'ennesimo elemento di un iterabile in questo modo

import itertools

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.