গণনা () এর অর্থ কী?


উত্তর:


513

enumerate()ফাংশন একটি iterable করার জন্য একটি কাউন্টার যোগ করে।

সুতরাং প্রতিটি উপাদান জন্য cursor, একটি tuple সঙ্গে উত্পাদিত হয় (counter, element); forলুপ বেঁধে যে row_numberএবং rowযথাক্রমে।

ডেমো:

>>> elements = ('foo', 'bar', 'baz')
>>> for elem in elements:
...     print elem
... 
foo
bar
baz
>>> for count, elem in enumerate(elements):
...     print count, elem
... 
0 foo
1 bar
2 baz

ডিফল্টরূপে, enumerate()গণনা শুরু হয় 0তবে আপনি যদি এটিটিকে দ্বিতীয় পূর্ণসংখ্যার যুক্তি দেন তবে পরিবর্তে এটি নম্বরটি থেকে শুরু হবে:

>>> for count, elem in enumerate(elements, 42):
...     print count, elem
... 
42 foo
43 bar
44 baz

আপনি যদি enumerate()পাইথনে পুনরায় প্রয়োগ করতে চান তবে তা অর্জনের দুটি উপায় এখানে রয়েছে; একটি itertools.count()গণনা করার জন্য ব্যবহার করছেন , অন্যটি নিজে একটি জেনারেটরের কার্যক্রমে গণনা করছেন :

from itertools import count

def enumerate(it, start=0):
    # return an iterator that adds a counter to each element of it
    return zip(count(start), it)

এবং

def enumerate(it, start=0):
    count = start
    for elem in it:
        yield (count, elem)
        count += 1

সি প্রকৃত বাস্তবায়ন আধুনিক কাছাকাছি, optimisations সঙ্গে সাধারণ জন্য একটি একক tuple বস্তুর পুনরায় ব্যবহার করার জন্য নয় for i, ...ক্ষেত্রে unpacking এবং কাউন্টার পর্যন্ত কাউন্টার একটি পাইথন পূর্ণসংখ্যা বস্তুর ব্যবহার এড়াতে বেশী বড় হয়ে একটি আদর্শ সি পূর্ণসংখ্যা মান ব্যবহার (যা সীমাবদ্ধ)।


92

এটি একটি অন্তর্নির্মিত ফাংশন যা এমন কোনও বস্তুকে ফেরত দেয় যা পুনরাবৃত্তি হতে পারে। ডকুমেন্টেশন দেখুন

সংক্ষেপে, এটি একটি পুনরাবৃত্তীয় উপাদানগুলির (যেমন একটি তালিকার মতো) উপরের লুপগুলি, পাশাপাশি একটি সূচী সংখ্যা হিসাবে, একটি টিউপলে মিলিত হয়:

for item in enumerate(["a", "b", "c"]):
    print item

কপি করে প্রিন্ট

(0, "a")
(1, "b")
(2, "c")

আপনি যদি কোনও সিক্যুয়েন্স (বা অন্য পুনরাবৃত্তিযোগ্য জিনিস) ধরে লুপ করতে চান এবং একটি সূচী কাউন্টার উপলব্ধ রাখতে চান তবে এটি সহায়ক। আপনি যদি কাউন্টারটি অন্য কোনও মান থেকে শুরু করতে চান (সাধারণত 1), আপনি এটি দ্বিতীয় যুক্তি হিসাবে দিতে পারেন enumerate


1
আপনি যদি দ্বিতীয় ভেরিয়েবল যোগ করেন itemতবে আপনি
আবদেলৌহাব

2
পেডেন্টিক: এটি একটি জেনারেটর নয়, পুনরুক্তি ফেরানোর একটি ফাংশন। জেনারেটর ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলির একটি নির্দিষ্ট শ্রেণি (ব্যবহার yield/ yield from, বা জেনারেটর এক্সপ্রেশন যা স্পষ্টভাবে yield); enumerateজেনারেটর নয়। সব হাঁস-টাইপিং সংক্রান্ত উদ্দেশ্যে জন্যে রয়েছে কোন পার্থক্য নেই, কিন্তু স্পষ্ট টাইপ পরীক্ষণ এবং পাইথন ভাষা ডক্স শুধুমাত্র একটি উদ্দেশ্য, যা কাভার করে না শব্দটি "জেনারেটর" ব্যবহার enumerate
শ্যাডোর্যাঞ্জার

22

আমি ব্রেট স্লাতকিনের একটি বই ( ইফেক্টিভ পাইথন ) পড়ছি এবং তিনি একটি তালিকার উপরে পুনরাবৃত্তি করতে এবং তালিকার বর্তমান আইটেমের সূচকটিও জানতে পারে তবে তিনি পরামর্শ দিয়েছেন যে এটি ব্যবহার না করা এবং enumerateপরিবর্তে ব্যবহার করা ভাল। আমি জানি আপনি গণিতের অর্থ কী জিজ্ঞাসা করেছেন, তবে আমি যখন নিম্নলিখিতগুলি বুঝতে পেরেছিলাম তখনও আমি বুঝতে পেরেছিলাম কীভাবে enumerateবর্তমান আইটেমের সূচীটি সহজ (এবং আরও পাঠযোগ্য) জানতে পেরে কীভাবে তালিকার উপরে পুনরাবৃত্তি করা যায় ।

list_of_letters = ['a', 'b', 'c']
for i in range(len(list_of_letters)):
    letter = list_of_letters[i]
    print (i, letter)

আউটপুটটি হ'ল:

0 a
1 b
2 c

enumerateফাংশনটি পড়ার আগে আমি কিছু করতাম এমনকি সিলিয়ারও করতাম ।

i = 0
for n in list_of_letters:
    print (i, n)
    i += 1

এটি একই আউটপুট উত্পাদন করে।

তবে enumerateআমাকে কেবল লিখতে হবে:

list_of_letters = ['a', 'b', 'c']
for i, letter in enumerate(list_of_letters):
    print (i, letter)

20

অন্য ব্যবহারকারীরা enumerateযেমন উল্লেখ করেছেন, একটি জেনারেটর যা একটি পুনরাবৃত্তিযোগ্য প্রতিটি আইটেমের পাশে একটি ইনক্রিমেন্টাল সূচক যুক্ত করে।

তাই আপনি যদি একটি তালিকা বলার আছে l = ["test_1", "test_2", "test_3"], list(enumerate(l))আপনি ভালো কিছু দিতে হবে: [(0, 'test_1'), (1, 'test_2'), (2, 'test_3')]

এখন, কখন এটি দরকারী? সম্ভাব্য ব্যবহারের কেসটি হ'ল আপনি যখন আইটেমগুলি দিয়ে পুনরাবৃত্তি করতে চান এবং আপনি কোনও নির্দিষ্ট আইটেমটি এড়িয়ে যেতে চান যা আপনি কেবল তালিকার সূচকটি জানেন তবে এর মানটি নয় (কারণ এর মানটি তখন জানা যায় না)।

for index, value in enumerate(joint_values):
   if index == 3:
       continue

   # Do something with the other `value`

সুতরাং আপনার কোডটি আরও ভালভাবে পড়তে পারে কারণ আপনি লুপের সাথে নিয়মিতও rangeকরতে পারেন তবে সেগুলি সূচী করার জন্য আপনার প্রয়োজনীয় আইটেমগুলি অ্যাক্সেস করতে (যেমন, joint_values[i])।

যদিও অন্য একজন ব্যবহারকারী enumerateব্যবহারের বাস্তবায়নের কথা উল্লেখ করেছেন zip, আমি মনে করি ব্যবহার না করেই আরও বিশুদ্ধ (তবে কিছুটা জটিল) উপায়টি itertoolsনিম্নলিখিত:

def enumerate(l, start=0):
    return zip(range(start, len(l) + start), l)

উদাহরণ:

l = ["test_1", "test_2", "test_3"]
enumerate(l)
enumerate(l, 10)

আউটপুট:

[(0, 'টেস্ট_1'), (1, 'টেস্ট_2'), (2, 'টেস্ট 14')]

[(10, 'টেস্ট_1'), (11, 'টেস্ট_2'), (12, 'টেস্ট_3')]

মন্তব্যে উল্লিখিত হিসাবে, পরিসীমা সহ এই পদ্ধতির মূল enumerateফাংশন যেমন স্বেচ্ছাসেবী পুনরাবৃত্তিগুলির সাথে কাজ করবে না ।


অন্যান্য উত্তরের উল্লেখ করার কারণটি itertoolsহ'ল আপনার rangeপন্থাটি কেবল পাত্রেই কাজ করে। enumerateনির্বিচারে পুনরাবৃত্তি সঙ্গে কাজ করে; আপনি যদি কোনও ফাইল পুনরাবৃত্তি করতে চান, for lineno, line in enumerate(myfile):কাজ করে তবে আপনি এটি করতে পারেননি range(len(myfile))কারণ আপনি ইওএফ পৌঁছানো পর্যন্ত দৈর্ঘ্য জানা যায়নি।
শ্যাডোর্যাঞ্জার

12

গণনা ফাংশন নিম্নলিখিত হিসাবে কাজ করে:

doc = """I like movie. But I don't like the cast. The story is very nice"""
doc1 = doc.split('.')
for i in enumerate(doc1):
     print(i)

আউটপুট হয়

(0, 'I like movie')
(1, " But I don't like the cast")
(2, ' The story is very nice')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.