วัตถุนับได้ แต่ไม่สามารถทำดัชนีได้?


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
เนื่องจากการแจกแจงไม่สามารถเข้าถึงดัชนี ไม่มีแนวคิดของ "นับ" ในงูหลามมันเป็นเพียง iterable
juanpa.arrivillaga

คำตอบ:


6

Python อนุญาตเฉพาะสิ่งเหล่านี้หากคลาสมีเมธอด:

  • __getitem__จำเป็นสำหรับ[]ไวยากรณ์
  • __iter__และ1จะต้องทำซ้ำ__next__

คลาสใดก็ได้สามารถกำหนดหนึ่งคลาสได้โดยไม่ต้องกำหนดคลาสอื่น __getattr__มักจะไม่ได้กำหนดถ้ามันจะไม่มีประสิทธิภาพ


1 จะต้องอยู่กับระดับที่ส่งกลับโดย__next____iter__


1

นี่เป็นผลมาจากfooการทำซ้ำได้ แต่ไม่มี__getitem__ฟังก์ชั่น คุณสามารถใช้itertools.issliceเพื่อรับองค์ประกอบที่ n ของ iterable เช่นนั้น

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 อินสแตนซ์ของคลาสที่กำหนดเองสามารถใช้การแจงนับผ่านพิเศษ (หรือ "dunder") __iter__วิธีการ บางทีชั้นนี้การดำเนินการแต่ไม่__iter____getitem__

ภาพรวมของ Dunder: https://dbader.org/blog/python-dunder-methods
Specs สำหรับ__iter__วิธีการ: https://docs.python.org/3/library/stdtypes.html#typeiter


1
ไม่ใช่ "การแจงนับ" แทน "การวนซ้ำ"
juanpa.arrivillaga
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.