2014-06-18 6 views
8

के साथ गणना करें पाइथन के enumerate फ़ंक्शन को बड़ी संख्या से कम (अवरोही क्रम, कमी, गिनती) से गणना करने के लिए कैसे करें? या सामान्य रूप से, enumerate में विभिन्न चरण वृद्धि/कमी का उपयोग कैसे करें?पायथन नीचे या कस्टम चरण

उदाहरण के लिए, इस तरह के समारोह के लिए, ['a', 'b', 'c'] सूची, शुरू मूल्य 10 और कदम -2 साथ, इटरेटर [(10, 'a'), (8, 'b'), (6, 'c')] उत्पादन होगा लागू होता है।

उत्तर

8

मैं, और अधिक सुरुचिपूर्ण मुहावरेदार, और संक्षिप्त तरीके से नहीं मिला है, एक सरल जनरेटर लिखने के लिए की तुलना में:

def enumerate2(xs, start=0, step=1): 
    for x in xs: 
     yield (start, x) 
     start += step 

उदाहरण:

>>> list(enumerate2([1,2,3], 5, -1)) 
[(5, 1), (4, 2), (3, 3)] 
>>> list(enumerate2([1,2,3], 5, -2)) 
[(5, 1), (3, 2), (1, 3)] 

आप उपरोक्त कोड समझ में नहीं आता है, तो , What does the "yield" keyword do in Python? और Difference between Python's Generators and Iterators पढ़ें।

+0

एक उचित कार्यान्वयन समाप्त हो जाता है। – pylang

+0

यह अब से गणना के लिए मेरा मानक उपयोग समारोह है। – Steampunkery

3

एक विकल्प एक range को zip अपने iterable के लिए है:

for index, item in zip(range(10, 0, -2), ['a', 'b', 'c']): 
    ... 

यह सीमा है कि आप को पता है कितनी दूर range (जाना चाहिए कम से कम यह कवर करना चाहिए की जरूरत है - मेरे उदाहरण के रूप में, zip द्वारा अतिरिक्त कटौती की जाएगी)।

आप नहीं जानते हैं, तो आप अपने खुद के "अनंत range" रोल और इस्तेमाल कर सकते हैं कि:

>>> def inf_range(start, step): 
    """Generator function to provide a never-ending range.""" 
    while True: 
     yield start 
     start += step 


>>> list(zip(inf_range(10, -2), ['a', 'b', 'c'])) 
[(10, 'a'), (8, 'b'), (6, 'c')] 
0

एक अन्य विकल्प कदम द्वारा itertools.count है, जो "गणना" के लिए उपयोगी है उपयोग करने के लिए है , में रिवर्स।

import itertools 

counter = itertools.count(10, -2) 
[(next(counter), letter) for letter in ["a", "b", "c"]] 
# [(10, 'a'), (8, 'b'), (6, 'c')] 

लक्षण

  • संक्षिप्त
  • कदम और दिशा तर्क दृढ़तापूर्वक count() में संग्रहित है
  • प्रगणित सूचकांक next()
  • count() साथ दोहराया जाता है स्वाभाविक अपरिमित है; उपयोगी टर्मिनल सीमा अज्ञात है अगर (@jonrsharpe देखें)
  • अनुक्रम लंबाई आंतरिक रूप से अनंत इटरेटर
संबंधित मुद्दे