1 से शुरू होने वाली संख्याओं की गणना कैसे करें


154

मैं पायथन 2.5 का उपयोग कर रहा हूं, मुझे ऐसा एन्यूमरेशन चाहिए, (0 के बजाय 1 से शुरू)

[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

मैं जानता हूँ कि पायथन 2.6 में आप ऐसा कर सकते हैं: उपरोक्त परिणाम देने के लिए h = enumerate (रेंज (2000, 2005), 1) लेकिन python2.5 में आप नहीं कर सकते ...

Python2.5 का उपयोग करना:

>>> h = enumerate(range(2000, 2005))
>>> [x for x in h]
[(0, 2000), (1, 2001), (2, 2002), (3, 2003), (4, 2004)]

क्या किसी को अजगर 2.5 में वांछित परिणाम प्राप्त करने का एक तरीका पता है?

धन्यवाद,

जेफ


4
बस जिज्ञासु, जैसा कि मैं कोई हूं जिसने पेशेवर रूप से अजगर के तरीके से बहुत कुछ नहीं किया है। क्या आप Python 2.5 तक सीमित हैं क्योंकि आपकी कंपनी संगतता कारणों से अपग्रेड नहीं करना चाहती है?
शॉन

2
सभी 2.x संस्करण पीछे की ओर संगत हैं, इसलिए इसका कोई कारण नहीं है।
जोचन रिट्जेल

कुछ मॉड्यूल को बताएं - वहाँ कुछ हैं जो Py 2.5 में काम करते हैं, लेकिन Py 2.6 में नहीं
xorsyst

जवाबों:


179

जैसा कि आप पहले ही उल्लेख कर चुके हैं, यह पायथन 2.6 या नए में करने के लिए सीधा है:

enumerate(range(2000, 2005), 1)

पाइथन 2.5 और इससे पुराने startपैरामीटर का समर्थन नहीं करते हैं, इसलिए इसके बजाय आप दो रेंज ऑब्जेक्ट बना सकते हैं और उन्हें ज़िप कर सकते हैं:

r = xrange(2000, 2005)
r2 = xrange(1, len(r) + 1)
h = zip(r2, r)
print h

परिणाम:

[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

यदि आप एक सूची के बजाय एक जनरेटर बनाना चाहते हैं तो आप इसके बजाय izip का उपयोग कर सकते हैं ।


उपयोग करना izipऔर xrangeगणना करने के करीब होगा
जॉन ला रोय

7
यह उत्तर तरीका पुराना है, आप अब enumerate(iterable, start=1)पाइथन 2.6 की तरह रख सकते हैं ।
फ्रेड्रिक ब्रेनन

@ फारब: क्या आपने प्रश्न पढ़ा है? वह पहले से ही अजगर 2.6 के लिए समाधान जानता है। उन्होंने विशेष रूप से एक समाधान के लिए कहा जो पायथन 2.5 में काम करता है।
मार्क बायर्स

1
@MarkByers जाहिर है मैं अंधा हूँ :) इसके बारे में वास्तव में खेद है। (यह "1 पर शुरू होने वाली गणना" के लिए Google में # 1 है)
फ्रेड्रिक ब्रेनन

2
@ 8chan हां, मैं अभी Google खोज से यहां आया हूं "शून्य
पिरामिड

166

सिर्फ पोस्टरिटी खातिर इसे यहाँ रखने के लिए, 2.6 में "स्टार्ट" पैरामीटर को इस तरह से एनुमरेट करने के लिए जोड़ा गया था:

enumerate(sequence, start=1)


26
ध्यान दें कि यह सूची में पहला आइटम नहीं छोड़ता है, यह प्रारंभ मूल्य द्वारा सूचकांक को बंद कर देता है, इसलिए यदि sequence[i]आपके कोड में कुछ ऐसा किया गया है: तो आपको सीमा से बाहर सरणी मिलेगी ।
फिएट

14

आसान, बस अपने स्वयं के कार्य को परिभाषित करें जो आपको चाहिए:

def enum(seq, start=0):
    for i, x in enumerate(seq):
        yield i+start, x

12

अजगर ३

आधिकारिक दस्तावेज: enumerate(iterable, start=0)

तो आप इसे इस तरह उपयोग करेंगे:

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']

>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]

>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

10

पाइथन 2.5 को करने का सबसे सरल तरीका जो आप पूछते हैं:

import itertools as it

... it.izip(it.count(1), xrange(2000, 2005)) ...

यदि आप एक सूची चाहते हैं, जैसा कि आप को दिखाई देता है, के zipबदले में उपयोग करें it.izip

(बीटीडब्ल्यू, एक सामान्य नियम के रूप में, एक जनरेटर या किसी अन्य चलने योग्य एक्स से बाहर सूची बनाने का सबसे अच्छा तरीका नहीं है [x for x in X] , बल्कि list(X))।


6
from itertools import count, izip

def enumerate(L, n=0):
    return izip( count(n), L)

# if 2.5 has no count
def count(n=0):
    while True:
        yield n
        n+=1

अब h = list(enumerate(xrange(2000, 2005), 1))काम करता है।


6

गणक तुच्छ है, और इसलिए इसे फिर से शुरू करने के लिए लागू कर रहा है:

def enumerate(iterable, start = 0):
    n = start
    for i in iterable:
        yield n, i
        n += 1

ध्यान दें कि यह प्रारंभ तर्क के बिना गणना के उपयोग से कोड को नहीं तोड़ता है। वैकल्पिक रूप से, यह ऑन्लाइनर अधिक सुरुचिपूर्ण और संभवतः तेज हो सकता है, लेकिन गणना के अन्य उपयोगों को तोड़ता है:

enumerate = ((index+1, item) for index, item)

उत्तरार्द्ध शुद्ध बकवास था। @ डंकन को रैपर सही मिला।


हां, कुल बकवास। इन पंक्तियों के साथ कुछ वास्तव में उदाहरण के लिए काम करेगा जैसे हास्केल (उस भाषा में करी करना अब तक की सबसे स्वाभाविक बात है, और इसके आलस्य के कारण, एक सूची लेने वाला फ़ंक्शन एक जनरेटर अभिव्यक्ति के समान है)। लेकिन वह मुझे बहाना नहीं देता - लंबे समय से अजगर उपयोगकर्ता - बीएस लिख रहा है। इस पर ध्यान दिलाने के लिए धन्यवाद।

5
>>> list(enumerate(range(1999, 2005)))[1:]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

गणना करने वाला एक जनरेटर होना चाहिए। एक बार में पूरी सूची बनाने के लिए अगर यह स्वीकार्य नहीं है, तो अक्सर यह
जानने के लिए

सामान्यीकृत: प्रारंभ = 4 सूची (गणना (रेंज (प्रारंभ) + रेंज (1999, 2005))) [प्रारंभ:]
टोनी वेइज़लीनन

रेंज हालांकि 2.52 में सूची में है
टोनी वेइज़लीनन

3

h = [(i + 1, x) for i, x in enumerate(xrange(2000, 2005))]


1
वह पायथन 2.5 में ऐसा नहीं कर सकता। प्रारंभ पैरामीटर Python 2.6 में प्रस्तुत किया गया था: docs.python.org/library/functions.html#enumerate । उन्होंने प्रश्न में इसका उल्लेख भी किया है।
मार्क बायर्स

इसका उत्तर प्रारंभिक संपादन से पहले दिया गया था, जब कोड अनफ़ॉर्म किया गया था और सूची के बजाय जनरेटर का उपयोग करने के लिए मुझे परेशानी महसूस हो रही थी।
क्रिस बी।

++: ऐसा करने का तरीका है
Nas Banov

2

ठीक है, मैं यहाँ थोड़ा बेवकूफ महसूस कर रहा हूँ ... क्या कारण है कि ऐसा कुछ नहीं है
[(a+1,b) for (a,b) in enumerate(r)]? यदि आप कार्य नहीं करेंगे, तो कोई समस्या नहीं:

>>> r = range(2000, 2005)
>>> [(a+1,b) for (a,b) in enumerate(r)]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

>>> enumerate1 = lambda r:((a+1,b) for (a,b) in enumerate(r)) 

>>> list(enumerate1(range(2000,2005)))   # note - generator just like original enumerate()
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

1
>>> h = enumerate(range(2000, 2005))
>>> [(tup[0]+1, tup[1]) for tup in h]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

चूंकि यह कुछ हद तक क्रियात्मक है, इसलिए मैं इसे सामान्य बनाने के लिए अपना स्वयं का कार्य लिखने की सलाह दूंगा:

def enumerate_at(xs, start):
    return ((tup[0]+start, tup[1]) for tup in enumerate(xs))

2
गणना करने वाला एक जनरेटर होना चाहिए। एक ही बार में पूरी सूची बनाने के लिए अगर यह स्वीकार्य नहीं है
जॉन ला रोय जूल

0

मुझे नहीं पता कि इन पदों को संभवतः अधिक जटिल कैसे बनाया जा सकता है:

# Just pass the start argument to enumerate ...
for i,word in enumerate(allWords, 1):
    word2idx[word]=i
    idx2word[i]=word
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.