Краткое изложение проблемы и вопрос
Я пытаюсь посмотреть на некоторые данные внутри объекта, которые можно перечислить, но не проиндексировать. Я все еще новичок в Python, но я не понимаю, как это возможно.
Если вы можете перечислить его, почему вы не можете получить доступ к индексу тем же способом, что и перечисление? И если нет, есть ли способ получить доступ к элементам индивидуально?
Фактический пример
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)
Возьмите выделенное подмножество набора данных
foo = train_data.take(5)
Я могу перебрать foo
с перечислю:
[In] for i, x in enumerate(foo):
print(i)
который генерирует ожидаемый результат:
0
1
2
3
4
Но затем, когда я пытаюсь внести в него индекс, foo[0]
я получаю эту ошибку:
---------------------------------------------------------------------------
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
Филипп Гельтман
источник
источник
Ответы:
Python допускает эти вещи только в том случае, если у класса есть методы для них:
__getitem__
требуется для[]
синтаксиса.__iter__
и 1 требуется для итерации.__next__
Любой класс может определить один без определения другого.
__getattr__
обычно не определяется, если это будет неэффективно.1
__next__
требуется для класса, возвращаемого__iter__
.источник
Это результат того,
foo
что он повторяется, но не имеет__getitem__
функции. Вы можете использовать,itertools.isslice
чтобы получить n-й элемент итерируемого какисточник
В Python экземпляры пользовательских классов могут реализовывать перечисление с помощью специального (или более сложного)
__iter__
метода. Возможно, этот класс реализует,__iter__
но нет__getitem__
.Обзор Dunder: https://dbader.org/blog/python-dunder-methods
Спецификации для
__iter__
метода: https://docs.python.org/3/library/stdtypes.html#typeiterисточник