गणना () का क्या अर्थ है?


जवाबों:


513

enumerate()समारोह एक iterable करने के लिए एक काउंटर कहते हैं।

तो प्रत्येक तत्व के लिए cursor, एक टपल का उत्पादन किया जाता है (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

सी में वास्तविक क्रियान्वयन उत्तरार्द्ध के करीब, अनुकूलन के साथ आम के लिए एक एकल टपल वस्तु का पुन: उपयोग करने के लिए है for i, ...मामला खोल और काउंटर तक काउंटर एक अजगर पूर्णांक वस्तु का उपयोग कर से बचने के लिए बहुत बड़ा हो जाता के लिए एक मानक सी पूर्णांक मान का उपयोग कर (जो असीम)।


92

यह एक बिल्टिन फ़ंक्शन है जो किसी ऑब्जेक्ट को लौटाता है जिसे ओवररेटेड किया जा सकता है। प्रलेखन देखें ।

संक्षेप में, यह एक पुनरावृत्ति के तत्वों (जैसे एक सूची), और साथ ही एक सूचकांक संख्या, एक टपल में संयुक्त पर लूप करता है:

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

प्रिंट

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

यदि आप किसी अनुक्रम (या अन्य चलने योग्य चीज़) पर लूप करना चाहते हैं, तो यह मददगार है और एक इंडेक्स काउंटर भी उपलब्ध होना चाहता है। यदि आप चाहते हैं कि काउंटर कुछ अन्य मूल्य (आमतौर पर 1) से शुरू हो, तो आप इसे दूसरे तर्क के रूप में दे सकते हैं enumerate


1
यदि आप एक दूसरे चर को जोड़ते हैं itemतो आप कोष्ठक को हटा सकते हैं: D
अब्देलौहाब

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, 'test_1'), (1, 'test_2'), (2, 'test_3')]

[(10, 'test_1'), (11, 'test_2'), (12, 'test_3')]

जैसा कि टिप्पणियों में उल्लेख किया गया है, रेंज के साथ यह दृष्टिकोण मनमाने ढंग से चलने के साथ काम नहीं करेगा जैसा कि मूल enumerateकार्य करता है।


अन्य उत्तर का कारण यह itertoolsहै कि आपका rangeदृष्टिकोण केवल कंटेनरों के साथ काम करता है। enumerateमनमाना चलने के साथ काम करता है; यदि आप किसी फ़ाइल को चलाना चाहते हैं, तो for lineno, line in enumerate(myfile):काम करते हैं, लेकिन आप ऐसा नहीं कर सकते range(len(myfile))क्योंकि EOF तक पहुंचने के लिए लंबाई ज्ञात नहीं है।
शैडो रेंजर

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')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.