オブジェクトは列挙可能ですが、インデックス付けはできませんか?


10

問題の概要と質問

列挙することはできても、インデックスを作成できないオブジェクト内のデータを調べようとしています。私はまだpythonの初心者ですが、これがどのようにして可能になるのかわかりません。

それを列挙できる場合、なぜ列挙と同じ方法でインデックスにアクセスできないのですか?そうでない場合、アイテムに個別にアクセスする方法はありますか?

実際の例

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)

データセットのサブセットを選択します

foo = train_data.take(5)

私ができる反復処理foo列挙して:

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

期待される出力を生成します:

0
1
2
3
4

しかし、それにインデックスを付けようとするfoo[0]と、次のエラーが発生します。

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

TypeError: 'TakeDataset' object does not support indexing

1
enumerateはインデックスにアクセスしないためです。Pythonには「列挙可能」という概念はなく、単に反復可能です
juanpa.arrivillaga '30

回答:


6

Pythonが許可するのは、クラスにメソッドがある場合のみです。

どのクラスでも、他を定義せずに1つを定義できます。__getattr__非効率的である場合、通常は定義されません。


__next__によって返されるクラスには1が必要です__iter__


1

これはfoo反復可能ですが、__getitem__関数がないためです。のitertools.issliceようにイテラブルのn番目の要素を取得するために使用できます

import itertools

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

0

Pythonでは、カスタムクラスのインスタンスは、特別な(または「ダンダー」)__iter__メソッドを介して列挙を実装できます。おそらく、このクラスは実装します__iter__が実装しません__getitem__

Dunderの概要:https ://dbader.org/blog/python-dunder-methods メソッドの
仕様__iter__https : //docs.python.org/3/library/stdtypes.html#typeiter


1
「列挙」ではなく「反復」
juanpa.arrivillaga
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.