Objekt ist aufzählbar aber nicht indizierbar?


10

Problemzusammenfassung und Frage

Ich versuche, einige der Daten in einem Objekt zu betrachten, die aufgelistet, aber nicht indiziert werden können. Ich bin noch neu in Python, aber ich verstehe nicht, wie das möglich ist.

Wenn Sie es aufzählen können, warum können Sie dann nicht auf die gleiche Weise wie beim Aufzählen auf den Index zugreifen? Und wenn nicht, gibt es eine Möglichkeit, einzeln auf die Artikel zuzugreifen?

Das eigentliche Beispiel

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)

Nehmen Sie eine ausgewählte Teilmenge des Datensatzes

foo = train_data.take(5)

Ich kannfoo mit Aufzählung wiederholen :

[In] for i, x in enumerate(foo):
    print(i)

welches die erwartete Ausgabe erzeugt:

0
1
2
3
4

Aber dann, wenn ich versuche, darin zu indizieren, foo[0]erhalte ich diesen Fehler:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-44-2acbea6d9862> in <module>
----> 1 foo[0]

TypeError: 'TakeDataset' object does not support indexing

1
Weil enumerate nicht auf einen Index zugreift. Es gibt kein Konzept von "aufzählbar" in Python, es ist nur iterierbar
juanpa.arrivillaga

Antworten:


6

Python erlaubt diese Dinge nur, wenn die Klasse Methoden für sie hat:

Jede Klasse kann eine definieren, ohne die andere zu definieren. __getattr__wird normalerweise nicht definiert, wenn es ineffizient wäre.


__next__Für die von zurückgegebene Klasse ist 1 erforderlich __iter__.


1

Dies ist ein Ergebnis der fooIterierbarkeit, aber ohne __getitem__Funktion. Sie können verwenden itertools.isslice, um das n-te Element eines iterablen wie dieses zu erhalten

import itertools

def nth(iterable, n, default=None):
    "Returns the nth item or a default value"
    return next(itertools.islice(iterable, n, None), default)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.