ऑब्जेक्ट एन्युमरेबल है लेकिन इंडेक्सेबल नहीं है?


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
क्योंकि एन्यूमरेट एक इंडेक्स को एक्सेस नहीं करता है। अजगर में "
enumerable

जवाबों:


6

पायथन केवल इन चीजों की अनुमति देता है यदि कक्षा में उनके लिए तरीके हैं:

  • __getitem__[]वाक्यविन्यास के लिए आवश्यक है ।
  • __iter__और 1 पुनरावृति के लिए आवश्यक हैं।__next__

कोई भी वर्ग दूसरे को परिभाषित किए बिना एक को परिभाषित कर सकता है। __getattr__आमतौर पर परिभाषित नहीं किया जाता है कि क्या यह अक्षम होगा।


1 __next__ द्वारा दिए गए वर्ग पर आवश्यक है __iter__


1

यह fooचलने योग्य होने का एक परिणाम है , लेकिन एक __getitem__फ़ंक्शन नहीं है। आप का उपयोग itertools.issliceकरने के लिए उपयोग कर सकते हैं जैसे nerable का तत्व

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

पायथन में, कस्टम वर्गों के उदाहरण विशेष (या "डंडर") __iter__विधि के माध्यम से गणना को लागू कर सकते हैं । शायद यह वर्ग लागू करता है __iter__लेकिन नहीं __getitem__

Dunder अवलोकन: https://dbader.org/blog/python-dunder-methods
एक __iter__विधि के लिए चश्मा : https://docs.python.org/3/library/stdtypes.html#typeiter


1
नहीं "गणना" बल्कि "पुनरावृत्ति"
juanpa.arrivillaga
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.