문제 요약 및 질문
열거 할 수는 있지만 색인을 생성 할 수없는 객체 내부의 일부 데이터를 보려고합니다. 나는 여전히 파이썬에 익숙하지 않지만 이것이 어떻게 가능한지 이해하지 못합니다.
열거 할 수 있다면 열거와 같은 방식으로 인덱스에 액세스 할 수없는 이유는 무엇입니까? 그렇지 않은 경우 항목에 개별적으로 액세스 할 수있는 방법이 있습니까?
실제 예
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
답변
파이썬은 클래스에 메소드가있는 경우에만 다음을 허용합니다.
__getitem__
[]
구문 에는 필수입니다 .__iter__
그리고 1 반복해야합니다.__next__
모든 클래스는 다른 클래스를 정의하지 않고 하나를 정의 할 수 있습니다. __getattr__
비효율적 인 경우 일반적으로 정의되지 않습니다.
에서 __next__
반환 한 클래스에는 1 이 필요합니다 __iter__
.
답변
이는 foo
반복 가능하지만 __getitem__
기능이 없는 결과입니다 . itertools.isslice
iterable의 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)
답변
파이썬에서, 커스텀 클래스의 인스턴스는 특별한 (또는 “dunder”) __iter__
메소드를 통해 열거를 구현할 수 있습니다 . 아마도이 클래스는 구현 __iter__
하지만 구현 하지는 않습니다 __getitem__
.
던더 개요 : https://dbader.org/blog/python-dunder-methods 메서드
사양 __iter__
: https://docs.python.org/3/library/stdtypes.html#typeiter