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

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


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)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.