Using Iterations in Python Effectively (original) (raw)

Last Updated : 06 Mar, 2023

Prerequisite: Iterators in Python Following are different ways to use iterators.

C-style approach: This approach requires prior knowledge of a total number of iterations.

Python

cars = [ "Aston" , "Audi" , "McLaren" ]

i = 0

while (i < len (cars)):

`` print cars[i]

`` i + = 1

Python3

cars = [ "Aston" , "Audi" , "McLaren" ]

i = 0

while (i < len (cars)):

`` print (cars[i])

`` i + = 1

Output

Aston Audi McLaren

Important Points:

Use of for-in (or for each) style: This style is used in python containing iterator of lists, dictionary, n dimensional-arrays, etc. The iterator fetches each component and prints data while looping. The iterator is automatically incremented/decremented in this construct.

Python

cars = [ "Aston" , "Audi" , "McLaren" ]

for x in cars:

`` print x

Python3

cars = [ "Aston" , "Audi" , "McLaren" ]

for x in cars:

`` print (x)

Output:

Aston Audi McLaren

See this for more examples of different data types.

Indexing using Range function: We can also use indexing using range() in Python.

Python

cars = [ "Aston" , "Audi" , "McLaren" ]

for i in range ( len (cars)):

`` print cars[i]

Python3

cars = [ "Aston" , "Audi" , "McLaren" ]

for i in range ( len (cars)):

`` print (cars[i])

Output:

Aston Audi McLaren

Enumerate: Enumerate is a built-in python function that takes input as iterator, list etc and returns a tuple containing index and data at that index in the iterator sequence. For example, enumerate(cars), returns a iterator that will return (0, cars[0]), (1, cars[1]), (2, cars[2]), and so on.

Python

cars = [ "Aston" , "Audi" , "McLaren " ]

for i, x in enumerate (cars):

`` print (x)

Output

Aston Audi McLaren

The below solution also works.

Python

cars = ["Aston" , "Audi", "McLaren "]

for x in enumerate (cars):

`` print (x[ 0 ], x[ 1 ])

Output :

(0, 'Aston') (1, 'Audi') (2, 'McLaren ')

We can also directly print returned value of enumerate() to see what it returns.

Python

cars = [ "Aston" , "Audi" , "McLaren " ]

print ( enumerate (cars))

Output :

<enumerate object at 0x7fe4f914d3c0>

Enumerate takes parameter start which is default set to zero. We can change this parameter to any value we like. In the below code we have used start as 1.

Python

cars = [ "Aston" , "Audi" , "McLaren " ]

for x in enumerate (cars, start = 1 ):

`` print (x[ 0 ], x[ 1 ])

Output

(1, 'Aston') (2, 'Audi') (3, 'McLaren ')

enumerate() helps to embed the solution for accessing each data item in the iterator and fetching index of each data item.

Looping extensions:

i) Two iterators for a single looping construct: In this case, a list and dictionary are to be used for each iteration in a single looping block using enumerate function. Let us see an example.

Python

cars = [ "Aston" , "Audi" , "McLaren" ]

accessories = [ "GPS kit" , "Car repair-tool kit" ]

prices = { 1 : "570000$" , 2 : "68000$" , 3 : "450000$" ,

`` 4 : "8900$" , 5 : "4500$" }

for index, c in enumerate (cars, start = 1 ):

`` print "Car: %s Price: %s" % (c, prices[index])

for index, a in enumerate (accessories, start = 1 ):

`` print ( "Accessory: %s Price: %s"

`` % (a, prices[index + len (cars)]))

Python3

cars = [ "Aston" , "Audi" , "McLaren" ]

accessories = [ "GPS kit" , "Car repair-tool kit" ]

prices = { 1 : "570000$" , 2 : "68000$" , 3 : "450000$" ,

`` 4 : "8900$" , 5 : "4500$" }

for index, c in enumerate (cars, start = 1 ):

`` print ( "Car: %s Price: %s" % (c, prices[index]))

for index, a in enumerate (accessories, start = 1 ):

`` print ( "Accessory: %s Price: %s"

`` % (a, prices[index + len (cars)]))

Output

Car: Aston Price: 570000$ Car: Audi Price: 68000$ Car: McLaren Price: 450000$ Accessory: GPS kit Price: 8900$ Accessory: Car repair-tool kit Price: 4500$

ii) zip function (Both iterators to be used in single looping construct): This function is helpful to combine similar type iterators(list-list or dict- dict etc,) data items at ith position. It uses the shortest length of these input iterators. Other items of larger length iterators are skipped. In case of empty iterators, it returns No output.

For example, the use of zip for two lists (iterators) helped to combine a single car and its required accessory.

Python

cars = [ "Aston" , "Audi" , "McLaren" ]

accessories = [ "GPS" , "Car Repair Kit" ,

`` "Dolby sound kit" ]

for c, a in zip (cars, accessories):

`` print "Car: %s, Accessory required: %s" \

`` % (c, a)

Python3

cars = [ "Aston" , "Audi" , "McLaren" ]

accessories = [ "GPS" , "Car Repair Kit" ,

`` "Dolby sound kit" ]

for c, a in zip (cars, accessories):

`` print ( "Car: %s, Accessory required: %s" % (c, a))

Output

Car: Aston, Accessory required: GPS Car: Audi, Accessory required: Car Repair Kit Car: McLaren, Accessory required: Dolby sound kit

The reverse of these iterators from zip function is known as unzipping using “*” operator. Use of enumerate function and zip function helps to achieve an effective extension of iteration logic in python and solves many more sub-problems of a huge task or problem.

Python

l1,l2 = zip ( * [( 'Aston' , 'GPS' ),

`` ( 'Audi' , 'Car Repair' ),

`` ( 'McLaren' , 'Dolby sound kit' )

`` ])

print (l1)

print (l2)

Output:

('Aston', 'Audi', 'McLaren') ('GPS', 'Car Repair', 'Dolby sound kit')