Does python enumerate start at 1?

In Python, you can get the element and index (count) from iterable objects such as list and tuple in for loop with the built-in function enumerate().

  • Built-in Functions - enumerate() — Python 3.8.5 documentation

This article describes the following contents.

  • How to use enumerate()
    • Normal for loop
    • for loop with enumerate()
  • Start index at 1 with enumerate()
  • Set step with enumerate()

See the following articles for more information about for loop and how to use enumerate() and zip() together.

  • for loop in Python (with range, enumerate, zip, etc.)
  • Use enumerate() and zip() together in Python

How to use enumerate()

Normal for loop

l = ['Alice', 'Bob', 'Charlie']

for name in l:
    print(name)
# Alice
# Bob
# Charlie

for loop with enumerate()

By passing an iterable object to enumerate(), you can get index, element.

for i, name in enumerate(l):
    print(i, name)
# 0 Alice
# 1 Bob
# 2 Charlie

Start index at 1 with enumerate()

As in the example above, by default, the index of enumerate() starts at 0.

If you want to start from another number, pass the number to the second argument of enumerate().

Start at 1:

for i, name in enumerate(l, 1):
    print(i, name)
# 1 Alice
# 2 Bob
# 3 Charlie

Start at the other number:

for i, name in enumerate(l, 42):
    print(i, name)
# 42 Alice
# 43 Bob
# 44 Charlie

For example, this is useful when generating sequential number strings starting from 1. It is smarter to pass the starting number to the second argument of enumerate() than to calculate i + 1.

for i, name in enumerate(l, 1):
    print('{:03}_{}'.format(i, name))
# 001_Alice
# 002_Bob
# 003_Charlie

Set step with enumerate()

There is no argument like step to specify increment to enumerate(), but it can be done as follows.

step = 3
for i, name in enumerate(l):
    print(i * step, name)
# 0 Alice
# 3 Bob
# 6 Charlie

I am using Python 2.5, I want an enumeration like so (starting at 1 instead of 0):

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

I know in Python 2.6 you can do: h = enumerate(range(2000, 2005), 1) to give the above result but in python2.5 you cannot...

Using Python 2.5:

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

Does anyone know a way to get that desired result in Python 2.5?

Seanny123

7,99312 gold badges65 silver badges117 bronze badges

asked Jul 21, 2010 at 20:37

3

As you already mentioned, this is straightforward to do in Python 2.6 or newer:

enumerate(range(2000, 2005), 1)

Python 2.5 and older do not support the start parameter so instead you could create two range objects and zip them:

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

Result:

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

If you want to create a generator instead of a list then you can use izip instead.

answered Jul 21, 2010 at 20:41

Mark ByersMark Byers

780k183 gold badges1551 silver badges1440 bronze badges

5

Just to put this here for posterity sake, in 2.6 the "start" parameter was added to enumerate like so:

enumerate(sequence, start=1)

answered Feb 6, 2013 at 18:28

dhacknerdhackner

2,8222 gold badges19 silver badges23 bronze badges

1

Python 3

Official Python documentation: enumerate(iterable, start=0)

You don't need to write your own generator as other answers here suggest. The built-in Python standard library already contains a function that does exactly what you want:

>>> 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')]

The built-in function is equivalent to this:

def enumerate(sequence, start=0):
  n = start
  for elem in sequence:
    yield n, elem
    n += 1

answered Jun 23, 2019 at 11:52

winklerrrwinklerrr

10.5k5 gold badges65 silver badges80 bronze badges

Easy, just define your own function that does what you want:

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

answered Jul 21, 2010 at 20:44

DuncanDuncan

88k10 gold badges116 silver badges155 bronze badges

Simplest way to do in Python 2.5 exactly what you ask about:

import itertools as it

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

If you want a list, as you appear to, use zip in lieu of it.izip.

(BTW, as a general rule, the best way to make a list out of a generator or any other iterable X is not [x for x in X], but rather list(X)).

answered Jul 21, 2010 at 21:48

Alex MartelliAlex Martelli

823k163 gold badges1202 silver badges1379 bronze badges

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

Now h = list(enumerate(xrange(2000, 2005), 1)) works.

answered Jul 21, 2010 at 20:43

Jochen RitzelJochen Ritzel

102k29 gold badges195 silver badges190 bronze badges

0

enumerate is trivial, and so is re-implementing it to accept a start:

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

Note that this doesn't break code using enumerate without start argument. Alternatively, this oneliner may be more elegant and possibly faster, but breaks other uses of enumerate:

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

The latter was pure nonsense. @Duncan got the wrapper right.

answered Jul 21, 2010 at 20:49

1

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

answered Jul 21, 2010 at 21:06

JABJAB

20.2k6 gold badges68 silver badges79 bronze badges

3

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

answered Jul 21, 2010 at 20:39

Chris B.Chris B.

80.8k25 gold badges95 silver badges136 bronze badges

3

Ok, I feel a bit stupid here... what's the reason not to just do it with something like
[(a+1,b) for (a,b) in enumerate(r)] ? If you won't function, no problem either:

>>> 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)]

answered Jul 22, 2010 at 3:55

Does python enumerate start at 1?

Nas BanovNas Banov

27.8k6 gold badges46 silver badges67 bronze badges

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

Since this is somewhat verbose, I'd recommend writing your own function to generalize it:

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

answered Jul 21, 2010 at 20:41

Eli CourtwrightEli Courtwright

179k65 gold badges208 silver badges256 bronze badges

1

I don't know how these posts could possibly be made more complicated then the following:

# Just pass the start argument to enumerate ...
for i,word in enumerate(allWords, 1):
    word2idx[word]=i
    idx2word[i]=word

answered May 27, 2019 at 17:00

Does python enumerate start at 1?

bmcbmc

8071 gold badge12 silver badges18 bronze badges

Does Python enumerate start at 0?

As in the example above, by default, the index of enumerate() starts at 0. If you want to start from another number, pass the number to the second argument of enumerate() .

How do you enumerate beginning from 1 in Python?

Enumerate Start at 1 in Python In Python, enumerate() takes an iterable and an optional start , as arguments. The value provided to start parameter acts as a starting point for the counter. To enumerate with a start of 1 , pass start=1 to enumerate() function.

What does enumerate () do in Python?

Python enumerate() Function The enumerate() function takes a collection (e.g. a tuple) and returns it as an enumerate object. The enumerate() function adds a counter as the key of the enumerate object.

How do you enumerate a number in Python?

Using the enumerate() Function The enumerate() function takes in an iterable as an argument, such as a list, string, tuple, or dictionary. In addition, it can also take in an optional argument, start, which specifies the number we want the count to start at (the default is 0). And that's it!