Using Iterations in Python Effectively

Prerequisite : Iterators in Python

Following are different ways to use iterators.

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

filter_none

edit
close

play_arrow

link
brightness_4
code

# A C-style way of accessing list elements
cars = ["Aston", "Audi", "McLaren"]
i = 0
while (i < len(cars)):
    print cars[i]
    i += 1

chevron_right


Output:

Aston
Audi 
McLaren 

Important Points:



  • This style of looping is rarely used by python programmers.
  • This 4-step approach creates no compactness with single-view looping construct.
  • This is also prone to errors in large-scale programs or designs.
  • There is no C-Style for loop in Python, i.e., a loop like for (int i=0; i<n; i++)

 

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

filter_none

edit
close

play_arrow

link
brightness_4
code

# Accessing items using for-in loop
  
cars = ["Aston", "Audi", "McLaren"]
for x in cars:
    print x

chevron_right


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.

filter_none

edit
close

play_arrow

link
brightness_4
code

# Accessing items using indexes and for-in
  
cars = ["Aston", "Audi", "McLaren"]
for i in range(len(cars)):
    print cars[i]

chevron_right


Output:

Aston
Audi 
McLaren 

 

Enumerate:
Enumerate is 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.

filter_none

edit
close

play_arrow

link
brightness_4
code

# Accessing items using enumerate()
  
cars = ["Aston" , "Audi", "McLaren "]
for i, x in enumerate(cars):
    print (x)

chevron_right


Output :

Aston
Audi
McLaren 

Below solution also works.



filter_none

edit
close

play_arrow

link
brightness_4
code

# Accessing items and indexes enumerate()
  
cars = ["Aston" , "Audi", "McLaren "]
for x in enumerate(cars):
    print (x[0], x[1])

chevron_right


Output :

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

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

filter_none

edit
close

play_arrow

link
brightness_4
code

# Printing return value of enumerate() 
  
cars = ["Aston" , "Audi", "McLaren "]
print enumerate(cars)

chevron_right


Output :

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

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.

filter_none

edit
close

play_arrow

link
brightness_4
code

# demonstrating the use of start in enumerate
  
cars = ["Aston" , "Audi", "McLaren "]
for x in enumerate(cars, start=1):
    print (x[0], x[1])

chevron_right


Output :

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

enumerate() helps to embed 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 example.

filter_none

edit
close

play_arrow

link
brightness_4
code

# Two separate lists
cars = ["Aston", "Audi", "McLaren"]
accessories = ["GPS kit", "Car repair-tool kit"]
  
# Single dictionary holds prices of cars and 
# its accessories.
# First three items store prices of cars and
# next two items store prices of accessories.
prices = {1:"570000$", 2:"68000$", 3:"450000$",
          4:"8900$", 5:"4500$"}
  
# Printing prices of cars
for index, c in enumerate(cars, start=1):
    print "Car: %s Price: %s"%(c, prices[index])
  
# Printing prices of accessories
for index, a in enumerate(accessories,start=1):
    print ("Accessory: %s Price: %s"\
           %(a,prices[index+len(cars)]))

chevron_right


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.

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python program to demonstrate the working of zip
  
# Two separate lists
cars = ["Aston", "Audi", "McLaren"]
accessories = ["GPS", "Car Repair Kit"
               "Dolby sound kit"]
  
# Combining lists and printing
for c, a in zip(cars, accessories):
    print "Car: %s, Accessory required: %s"\
          %(c, a)

chevron_right


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.

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python program to demonstrate unzip (reverse 
# of zip)using * with zip function
  
# Unzip lists
l1,l2 = zip(*[('Aston', 'GPS'), 
              ('Audi', 'Car Repair'), 
              ('McLaren', 'Dolby sound kit'
           ])
  
# Printing unzipped lists      
print(l1)
print(l2)

chevron_right


Output:

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

References:
1. https://docs.python.org/2/library/functions.html#enumerate
2. https://docs.python.org/2/library/functions.html#zip

This article is contributed by Krishnasagar Subhedarpage. If you like GeeksforGeeks and would like to contribute, you can also write an article and mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



My Personal Notes arrow_drop_up

Improved By : PRIYESH PATEL 1



Article Tags :

6


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.