객체는 열거 가능하지만 색인을 생성 할 수 없습니까?


10

문제 요약 및 질문

열거 할 수는 있지만 색인을 생성 할 수없는 객체 내부의 일부 데이터를 보려고합니다. 나는 여전히 파이썬에 익숙하지 않지만 이것이 어떻게 가능한지 이해하지 못합니다.

열거 할 수 있다면 열거와 같은 방식으로 인덱스에 액세스 할 수없는 이유는 무엇입니까? 그렇지 않은 경우 항목에 개별적으로 액세스 할 수있는 방법이 있습니까?

실제 예

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
열거 형은 인덱스에 액세스하지 않기 때문입니다. 의 개념은 "열거는"파이썬에서, 그것은 반복 가능한 단지이다 없다
juanpa.arrivillaga은

답변:


6

파이썬은 클래스에 메소드가있는 경우에만 다음을 허용합니다.

모든 클래스는 다른 클래스를 정의하지 않고 하나를 정의 할 수 있습니다. __getattr__비효율적 인 경우 일반적으로 정의되지 않습니다.


에서 __next__ 반환 한 클래스에는 1 이 필요합니다 __iter__.


1

이는 foo반복 가능하지만 __getitem__기능이 없는 결과입니다 . itertools.issliceiterable의 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)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.