Resumo e pergunta do problema
Eu estou tentando olhar para alguns dos dados dentro de um objeto que pode ser enumerado, mas não indexado. Ainda sou novato em python, mas não entendo como isso é possível.
Se você pode enumerá-lo, por que não pode acessar o índice da mesma maneira que enumera? E se não, existe uma maneira de acessar os itens individualmente?
O exemplo real
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)
Pegue um subconjunto selecionado do conjunto de dados
foo = train_data.take(5)
Eu posso iterar foo
com enumerar:
[In] for i, x in enumerate(foo):
print(i)
que gera a saída esperada:
0
1
2
3
4
Mas então, quando tento indexar, foo[0]
recebo este erro:
---------------------------------------------------------------------------
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
fonte
fonte
Respostas:
O Python só permite essas coisas se a classe tiver métodos para eles:
__getitem__
é necessário para a[]
sintaxe.__iter__
e 1 são necessários para iterar.__next__
Qualquer classe pode definir uma sem definir a outra.
__getattr__
geralmente não está definido se seria ineficiente.1 1
__next__
é obrigatório na classe retornada por__iter__
.fonte
Isso é resultado de
foo
ser iterável, mas não ter uma__getitem__
função. Você pode usaritertools.isslice
para obter o enésimo elemento de um iterável como essefonte
No Python, instâncias de classes personalizadas podem implementar a enumeração através do
__iter__
método especial (ou "dunder") . Talvez essa classe implemente,__iter__
mas não__getitem__
.Visão geral do Dunder: https://dbader.org/blog/python-dunder-methods
Especificações para um
__iter__
método: https://docs.python.org/3/library/stdtypes.html#typeiterfonte