Obyek dapat dihitung tetapi tidak dapat diindeks?

10

Ringkasan masalah dan pertanyaan

Saya mencoba untuk melihat beberapa data di dalam objek yang dapat disebutkan tetapi tidak diindeks. Saya masih baru di python, tapi saya tidak mengerti bagaimana ini mungkin.

Jika Anda dapat menghitungnya, mengapa Anda tidak dapat mengakses indeks melalui cara penghitungan yang sama? Dan jika tidak, apakah ada cara untuk mengakses item secara individual?

Contoh yang sebenarnya

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)

Ambil subset tertentu dari dataset

foo = train_data.take(5)

Saya bisa beralih foodengan menghitung:

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

yang menghasilkan output yang diharapkan:

0
1
2
3
4

Tetapi kemudian, ketika saya mencoba untuk mengindeks ke dalamnya foo[0]saya mendapatkan kesalahan ini:

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

TypeError: 'TakeDataset' object does not support indexing
Phillip Geltman
sumber
1
Karena enumerate tidak mengakses indeks. Tidak ada konsep "enumerable" dengan python, itu hanya dapat
diubah

Jawaban:

6

Python hanya mengizinkan hal-hal ini jika kelas memiliki metode untuk mereka:

Setiap kelas dapat mendefinisikan satu tanpa mendefinisikan yang lain. __getattr__biasanya tidak didefinisikan jika tidak efisien.


1 __next__ diperlukan di kelas yang dikembalikan oleh __iter__.

Anonim
sumber
1

Ini adalah hasil dari foomenjadi iterable, tetapi tidak memiliki __getitem__fungsi. Anda dapat menggunakan itertools.issliceuntuk mendapatkan elemen ke-iterable seperti itu

import itertools

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