How do I access the index in a for
loop like the following?
ints = [8, 23, 45, 12, 78]
for i in ints:
print('item #{} = {}'.format(???, i))
I want to get this output:
item #1 = 8
item #2 = 23
item #3 = 45
item #4 = 12
item #5 = 78
When I loop through it using a for
loop, how do I access the loop index, from 1 to 5 in this case?
Using an additional state variable, such as an index variable (which you would normally use in languages such as C or PHP), is considered non-pythonic.
The better option is to use the built-in function enumerate()
, available in both Python 2 and 3:
for idx, val in enumerate(ints):
print(idx, val)
Check out PEP 279 for more.
Mike Hordecki
Using a for loop, how do I access the loop index, from 1 to 5 in this case?
Use enumerate
to get the index with the element as you iterate:
for index, item in enumerate(items):
print(index, item)
And note that Python's indexes start at zero, so you would get 0 to 4 with the above. If you want the count, 1 to 5, do this:
count = 0 # in case items is empty and you need it after the loop
for count, item in enumerate(items, start=1):
print(count, item)
Unidiomatic control flow
What you are asking for is the Pythonic equivalent of the following, which is the algorithm most programmers of lower-level languages would use:
index = 0 # Python's indexing starts at zero
for item in items: # Python's for loops are a "for each" loop
print(index, item)
index += 1
Or in languages that do not have a for-each loop:
index = 0
while index < len(items):
print(index, items[index])
index += 1
or sometimes more commonly (but unidiomatically) found in Python:
for index in range(len(items)):
print(index, items[index])
Use the Enumerate Function
Python's enumerate
function reduces the visual clutter by hiding the accounting for the indexes, and encapsulating the iterable into another iterable (an enumerate
object) that yields a two-item tuple of the index and the item that the original iterable would provide. That looks like this:
for index, item in enumerate(items, start=0): # default is zero
print(index, item)
This code sample is fairly well the canonical example of the difference between code that is idiomatic of Python and code that is not. Idiomatic code is sophisticated (but not complicated) Python, written in the way that it was intended to be used. Idiomatic code is expected by the designers of the language, which means that usually this code is not just more readable, but also more efficient.
Getting a count
Even if you don't need indexes as you go, but you need a count of the iterations (sometimes desirable) you can start with 1
and the final number will be your count.
count = 0 # in case items is empty
for count, item in enumerate(items, start=1): # default is zero
print(item)
print('there were {0} items printed'.format(count))
The count seems to be more what you intend to ask for (as opposed to index) when you said you wanted from 1 to 5.
Breaking it down - a step by step explanation
To break these examples down, say we have a list of items that we want to iterate over with an index:
items = ['a', 'b', 'c', 'd', 'e']
Now we pass this iterable to enumerate, creating an enumerate object:
enumerate_object = enumerate(items) # the enumerate object
We can pull the first item out of this iterable that we would get in a loop with the next
function:
iteration = next(enumerate_object) # first iteration from enumerate
print(iteration)
And we see we get a tuple of 0
, the first index, and 'a'
, the first item:
(0, 'a')
we can use what is referred to as "sequence unpacking" to extract the elements from this two-tuple:
index, item = iteration
# 0, 'a' = (0, 'a') # essentially this.
and when we inspect index
, we find it refers to the first index, 0, and item
refers to the first item, 'a'
.
>>> print(index)
0
>>> print(item)
a
Conclusion
- Python indexes start at zero
- To get these indexes from an iterable as you iterate over it, use the enumerate function
- Using enumerate in the idiomatic way (along with tuple unpacking) creates code that is more readable and maintainable:
So do this:
for index, item in enumerate(items, start=0): # Python indexes start at zero
print(index, item)
Aaron Hall
It's pretty simple to start it from 1
other than 0
:
for index, item in enumerate(iterable, start=1):
print index, item # Used to print in python<3.x
print(index, item) # Mirate print() after 3.x+
A.J.
for i in range(len(ints)):
print(i, ints[i]) # print updated to print() in Python 3.x+
David Hanak
As is the norm in Python there are several ways to do this. In all examples assume: lst = [1, 2, 3, 4, 5]
1. Using enumerate (considered most idiomatic)
for index, element in enumerate(lst):
# do the things that need doing here
This is also the safest option in my opinion because the chance of going into infinite recursion has been eliminated. Both the item and its index are held in variables and there is no need to write any further code
to access the item.
2. Creating a variable to hold the index (using for
)
for index in range(len(lst)): # or xrange
# you will have to write extra code to get the element
3. Creating a variable to hold the index (using while
)
index = 0
while index < len(lst):
# you will have to write extra code to get the element
index += 1 # escape infinite recursion
4. There is always another way
As explained before, there are other ways to do this that have not been explained here and they may even apply more in other situations. e.g using itertools.chain
with for. It handles nested loops better than the other examples.
Charitoo
Old fashioned way:
for ix in range(len(ints)):
print(ints[ix])
List comprehension:
[ (ix, ints[ix]) for ix in range(len(ints))]
>>> ints
[1, 2, 3, 4, 5]
>>> for ix in range(len(ints)): print ints[ix]
...
1
2
3
4
5
>>> [ (ix, ints[ix]) for ix in range(len(ints))]
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]
>>> lc = [ (ix, ints[ix]) for ix in range(len(ints))]
>>> for tup in lc:
... print(tup)
...
(0, 1)
(1, 2)
(2, 3)
(3, 4)
(4, 5)
>>>
Charlie Martin
Accessing indexes & Performance Benchmarking of approaches
The fastest way to access indexes of list within loop in Python 3.7 is to use the enumerate method for small, medium and huge lists.
Please see different approaches which can be used to iterate over list and access index value and their performance metrics (which I suppose would be useful for you) in code samples below:
# Using range
def range_loop(iterable):
for i in range(len(iterable)):
1 + iterable[i]
# Using enumerate
def enumerate_loop(iterable):
for i, val in enumerate(iterable):
1 + val
# Manual indexing
def manual_indexing_loop(iterable):
index = 0
for item in iterable:
1 + item
index += 1
See performance metrics for each method below:
from timeit import timeit
def measure(l, number=10000):
print("Measure speed for list with %d items" % len(l))
print("range: ", timeit(lambda :range_loop(l), number=number))
print("enumerate: ", timeit(lambda :enumerate_loop(l), number=number))
print("manual_indexing: ", timeit(lambda :manual_indexing_loop(l), number=number))
# Measure speed for list with 1000 items
measure(range(1000))
# range: 1.161622366
# enumerate: 0.5661940879999996
# manual_indexing: 0.610455682
# Measure speed for list with 100000 items
measure(range(10000))
# range: 11.794482958
# enumerate: 6.197628574000001
# manual_indexing: 6.935181098000001
# Measure speed for list with 10000000 items
measure(range(10000000), number=100)
# range: 121.416859069
# enumerate: 62.718909123
# manual_indexing: 69.59575057400002
As the result, using enumerate
method is the fastest method for iteration when the index needed.
Adding some useful links below:
Andriy Ivaneyko
Here's what you get when you're accessing index in for
loops:
for i in enumerate(items): print(i)
items = [8, 23, 45, 12, 78]
for i in enumerate(items):
print("index/value", i)
Result:
# index/value (0, 8)
# index/value (1, 23)
# index/value (2, 45)
# index/value (3, 12)
# index/value (4, 78)
for i, val in enumerate(items): print(i, val)
items = [8, 23, 45, 12, 78]
for i, val in enumerate(items):
print("index", i, "for value", val)
Result:
# index 0 for value 8
# index 1 for value 23
# index 2 for value 45
# index 3 for value 12
# index 4 for value 78
for i, val in enumerate(items): print(i)
items = [8, 23, 45, 12, 78]
for i, val in enumerate(items):
print("index", i)
Result:
# index 0
# index 1
# index 2
# index 3
# index 4
Andy Fedoroff
First of all, the indexes will be from 0 to 4. Programming languages start counting from 0; don't forget that or you will come across an index out of bounds exception. All you need in the for loop is a variable counting from 0 to 4 like so:
for x in range(0, 5):
Keep in mind that I wrote 0 to 5 because the loop stops one number before the max. :)
To get the value of an index use
list[index]
ytpillai
According to this discussion: http://bytes.com/topic/python/answers/464012-objects-list-index
Loop counter iteration
The current idiom for looping over the indices makes use of the built-in range
function:
for i in range(len(sequence)):
# work with index i
Looping over both elements and indices can be achieved either by the old idiom or by using the new zip
built-in function:
for i in range(len(sequence)):
e = sequence[i]
# work with index i and element e
or
for i, e in zip(range(len(sequence)), sequence):
# work with index i and element e
via http://www.python.org/dev/peps/pep-0212/
thinker007
You can do it with this code:
ints = [8, 23, 45, 12, 78]
index = 0
for value in (ints):
index +=1
print index, value
Use this code if you need to reset the index value at the end of the loop:
ints = [8, 23, 45, 12, 78]
index = 0
for value in (ints):
index +=1
print index, value
if index >= len(ints)-1:
index = 0
Liam
If I were to iterate nums = [1, 2, 3, 4, 5]
I would do
for i, num in enumerate(nums, start=1):
print(i, num)
Or get the length as l = len(nums)
for i in range(l):
print(i+1, nums[i])
Ankur Kothari
The best solution for this problem is to use the enumerate
builtin function.
enumerate
returns a tuple
, where the first value is the index and the second value is the element of the list at that index.
In [1]: ints = [8, 23, 45, 12, 78]
In [2]: for idx, val in enumerate(ints):
...: print(idx, val)
...:
(0, 8)
(1, 23)
(2, 45)
(3, 12)
(4, 78)
Anurag Misra
In your question, you write "how do I access the loop index, from 1 to 5 in this case?"
However, the index for a list runs from zero. So, then we need to know if what you actually want is the index and item for each item in a list, or whether you really want numbers starting from 1. Fortunately, in Python, it is easy to do either or both.
First, to clarify, the enumerate
function iteratively returns the index and corresponding item for each item in a list.
alist = [1, 2, 3, 4, 5]
for n, a in enumerate(alist):
print("%d %d" % (n, a))
The output for the above is then,
0 1
1 2
2 3
3 4
4 5
Notice that the index runs from 0. This kind of indexing is common among modern programming languages including Python and C.
If you want your loop to span a part of the list, you can use the standard Python syntax for a part of the list. For example, to loop from the second item in a list up to but not including the last item, you could use
for n, a in enumerate(alist[1:-1]):
print("%d %d" % (n, a))
Note that once again, the output index runs from 0,
0 2
1 3
2 4
That brings us to the start=n
switch for enumerate()
. This simply offsets the index, you can equivalently simply add a number to the index inside the loop.
for n, a in enumerate(alist, start=1):
print("%d %d" % (n, a))
for which the output is
1 1
2 2
3 3
4 4
5 5
DrM
You can also try this:
data = ['itemA.ABC', 'itemB.defg', 'itemC.drug', 'itemD.ashok']
x = []
for (i, item) in enumerate(data):
a = (i, str(item).split('.'))
x.append(a)
for index, value in x:
print(index, value)
The output is
0 ['itemA', 'ABC']
1 ['itemB', 'defg']
2 ['itemC', 'drug']
3 ['itemD', 'ashok']
Ashok Kumar Jayaraman
If there is no duplicate value in the list:
for i in ints:
indx = ints.index(i)
print(i, indx)
RIshu
You can use the index
method
ints = [8, 23, 45, 12, 78]
inds = [ints.index(i) for i in ints]
EDIT
Highlighted in the comment that this method doesn’t work if there are duplicates in ints
, the method below should work for any values in ints
:
ints = [8, 8, 8, 23, 45, 12, 78]
inds = [tup[0] for tup in enumerate(ints)]
Or alternatively
ints = [8, 8, 8, 23, 45, 12, 78]
inds = [tup for tup in enumerate(ints)]
if you want to get both the index and the value in ints
as a list of tuples.
It uses the method of enumerate
in the selected answer to this question, but with list comprehension, making it faster with less code.
PyRsquared
Simple answer using While Loop:
arr = [8, 23, 45, 12, 78]
i = 0
while i < len(arr):
print("Item ", i + 1, " = ", arr[i])
i += 1
Output:
Amar Kumar
To print tuple of (index, value) in list comprehension using a for
loop:
ints = [8, 23, 45, 12, 78]
print [(i,ints[i]) for i in range(len(ints))]
Output:
[(0, 8), (1, 23), (2, 45), (3, 12), (4, 78)]
lola
You can simply use a variable such as count
to count the number of elements in the list:
ints = [8, 23, 45, 12, 78]
count = 0
for i in ints:
count = count + 1
print('item #{} = {}'.format(count, i))
Rahul
You can use enumerate to iterate over list and use start=1
since it will default to 0, meaning it would start counting at 0.
Here is an example:
for index,val in enumerate(ints,start=1):
print(f"item #{index} = {val}")
Also, use of f-strings
is a fast way to get your requested output and it is more readable as you can pass index and val into {}-placeholder directly.
Output:
item #1 = 8
item #2 = 23
item #3 = 45
item #4 = 12
item #5 = 78
Purnima
This serves the well enough:
list2 = [11, 'sumit', 43.21, 'sharma', '44', 'test', 2]
for x in list1:
print( 'index: ', list2.index(x), 'value:', x )
Sumit Kumar
Use enumerate to iterate over the list
ints = [8, 23, 45, 12, 78]
for idx,val in enumerate(ints):
print('item #{} = {}'.format(idx+1, val))
Output:
item #1 = 8
item #2 = 23
item #3 = 45
item #4 = 12
item #5 = 78
prashant sachdevaRetrieved from : http:www.stackoverflow.com/questions/522563/accessing-the-index-in-for-loops