Nesne numaralandırılabilir ancak dizine eklenemez mi?


10

Problem özeti ve soru

Bazı numaralandırılabilir ancak dizine alınmamış bir nesnenin içindeki verilere bakmaya çalışıyorum. Python'a hala yeniyim, ama bunun nasıl mümkün olduğunu anlamıyorum.

Numaralandırmayı yapabiliyorsanız, numaralandırmaya neden aynı numaralandırma ile erişemiyorsunuz? Değilse, öğelere ayrı ayrı erişmenin bir yolu var mı?

Gerçek örnek

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)

Veri kümesinin belirli bir alt kümesini alın

foo = train_data.take(5)

Ben yapabilirsiniz üzerinde yineleme fooenumerate ile:

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

beklenen çıktıyı üretir:

0
1
2
3
4

Ama sonra, içine dizin oluşturmaya çalıştığınızda foo[0]bu hatayı alıyorum:

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

TypeError: 'TakeDataset' object does not support indexing

1
Çünkü numaralandırma bir dizine erişmez. Python "numaralandırılabilir" bir kavram yoktur, sadece yinelenebilir
juanpa.arrivillaga

Yanıtlar:


6

Python bunlara sadece sınıfın kendileri için yöntemleri varsa izin verir:

Herhangi bir sınıf diğerini tanımlamaksızın birini tanımlayabilir. __getattr__verimsiz olursa genellikle tanımlanmaz.


__next__Tarafından döndürülen sınıfta 1 gerekiyor __iter__.


1

Bu, footekrarlanabilir olmanın bir sonucudur , ancak bir __getitem__işlevi yoktur. Böyle itertools.isslicebir yinelenebilir öğenin nth elemanını almak için kullanabilirsiniz

import itertools

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.