Obiekt jest policzalny, ale nie można go indeksować?

10

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ć fooz 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
Phillip Geltman
źródło
1
Ponieważ wyliczenie nie ma dostępu do indeksu. W pythonie nie ma pojęcia „wyliczalny”, można go jedynie
iterować

Odpowiedzi:

6

Python zezwala tylko na te rzeczy, jeśli klasa ma dla nich metody:

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

Anonimowy
źródło
1

Jest to wynik fooiteracji, ale brak __getitem__funkcji. Możesz użyć, itertools.issliceaby uzyskać n-ty element iterowalnego typu

import itertools

def nth(iterable, n, default=None):
    "Returns the nth item or a default value"
    return next(itertools.islice(iterable, n, None), default)
kopie
źródło