Podsumowanie problemu i pytanie
Próbuję spojrzeć na niektóre dane wewnątrz obiektu, które można wyliczyć, ale nie można ich indeksować. Nadal jestem nowy w Pythonie, ale nie rozumiem, jak to możliwe.
Jeśli możesz to wyliczyć, dlaczego nie możesz uzyskać dostępu do indeksu w ten sam sposób, w jaki to robi? A jeśli nie, to czy istnieje sposób na uzyskanie indywidualnego dostępu do przedmiotów?
Rzeczywisty przykład
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)
Wybierz wybrany podzbiór zestawu danych
foo = train_data.take(5)
I może iterować foo
z enumerate:
[In] for i, x in enumerate(foo):
print(i)
który generuje oczekiwany wynik:
0
1
2
3
4
Ale wtedy, gdy próbuję się do niego zindeksować, pojawia foo[0]
się ten błąd:
---------------------------------------------------------------------------
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
źródło
źródło
Odpowiedzi:
Python zezwala tylko na te rzeczy, jeśli klasa ma dla nich metody:
__getitem__
jest wymagane dla[]
składni.__iter__
i 1 są wymagane do iteracji.__next__
Każda klasa może zdefiniować jedną bez definiowania drugiej.
__getattr__
zwykle nie jest zdefiniowany, jeśli byłby nieefektywny.1
__next__
jest wymagane w klasie zwróconej przez__iter__
.źródło
Jest to wynik
foo
iteracji, ale brak__getitem__
funkcji. Możesz użyć,itertools.isslice
aby uzyskać n-ty element iterowalnego typuźródło
W Pythonie instancje klas niestandardowych mogą implementować wyliczanie za pomocą specjalnej (lub „dunder”)
__iter__
metody. Być może ta klasa implementuje,__iter__
ale nie__getitem__
.Omówienie Dunder: https://dbader.org/blog/python-dunder-methods
Specyfikacje dotyczące
__iter__
metody: https://docs.python.org/3/library/stdtypes.html#typeiterźródło