অবজেক্টটি এনুমেয়াল তবে ইনডেক্সযোগ্য নয়?


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
কারণ গণনা একটি সূচক অ্যাক্সেস করে না। পাইথনে "
গণনার

উত্তর:


6

পাইথন কেবল তখনই এই জিনিসগুলিকে অনুমতি দেয় যদি ক্লাসে তাদের জন্য পদ্ধতি থাকে:

  • __getitem__[]সিনট্যাক্সের জন্য প্রয়োজনীয় ।
  • __iter__এবং 1 পুনরাবৃত্তি করা প্রয়োজন।__next__

যে কোনও শ্রেণি অন্যটিকে সংজ্ঞায়িত না করে একটির সংজ্ঞা দিতে পারে। __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

পাইথনে, কাস্টম শ্রেণীর উদাহরণগুলি বিশেষ (বা "ডেন্ডার") __iter__পদ্ধতির মাধ্যমে গণনা কার্যকর করতে পারে । সম্ভবত এই শ্রেণীর প্রয়োগ __iter__কিন্তু না __getitem__

ডান্ডার ওভারভিউ: https://dbader.org/blog/python-dunder-methods
একটি __iter__পদ্ধতির স্পেস : https://docs.python.org/3/library/stdtyype.html#typeiter


1
"গণনা" নয় বরং "পুনরাবৃত্তি"
juanpa.arrivillaga 30:39
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.