Python Beginner Concepts Tutorial

Iterate over Index Numbers and Elements in a List Using Enumerate

Import Library

In [1]:
from collections import defaultdict

Definition of Enumerate

enumerate() is a powerful Python built-in function that helps you easily iterate over indexes and values in a sequence, iterator or other object that supports iteration.

enumerate() returns an enumerate object.

In [2]:
enumerate([1, 2, 3])
Out[2]:
<enumerate at 0x10e3ced38>

Simple Example

You ask Jen to make a list of dinner choices and rank them; you want to see the values and numeric ranks.

In [3]:
jen_dinner_choices = ["pasta", "pizza", "salad", "burger"]

There's two ways to preview the values and ranks.

Loop and print

In [4]:
for index, choice in enumerate(jen_dinner_choices):
    print(index, choice)
0 pasta
1 pizza
2 salad
3 burger

Create list of tuples that contain (index, value)

In [5]:
list(enumerate(jen_dinner_choices))
Out[5]:
[(0, 'pasta'), (1, 'pizza'), (2, 'salad'), (3, 'burger')]

Example Continued

You ask preferences of three more friends to rank these four choices and want to see which is the top pick.

In [6]:
ed_dinner_choices = ["burger", "pizza", "pasta", "salad"]
matt_dinner_choices = ["salad", "pasta", "burger", "pizza"]
pam_dinner_choices = ["pizza", "pasta", "burger", "salad"]

Let's sum up the ranks of food options. The lowest sum food option is the dinner pick!

We'll use a Python built-in dictionary-like object called defaultdict.

In [7]:
# define empty defaultdict to store keys as food options (strings) and values as cumulative rankings (ints)
# default value of int in line below is 0
choice_ranks = defaultdict(int)

def increment_choice_ranks(person_choices_ranks, food_option_rank):
    """Add individual person's food rankings to cumulative rankings defaultdict
    
    Keyword arguments: 
    person_choices_ranks -- person's ranking of four food options (list)
    food_option_rank -- cumulative food rankings (defaultdict)
    """
    # loop through index and values of person's food rankings
    for index, choice in enumerate(person_choices_ranks):
        
        print("food rank is: {0}".format(index))
        print("food choice is: {0}".format(choice))
        
        # increment cumulative ranking value by person's rank
        food_option_rank[choice] += index
        
        print("new food_option_rank is: {0}".format(food_option_rank))
        print(" ")
        
    # return our cumulative food rankings
    return food_option_rank

Call our increment_choice_ranks function using each person's food choices; each time, we increment our choice_ranks defaultdict.

The output is printed below to show how the defaultdict changes with each new food ranking.

In [8]:
choice_ranks = increment_choice_ranks(jen_dinner_choices, choice_ranks)
choice_ranks = increment_choice_ranks(ed_dinner_choices, choice_ranks)
choice_ranks = increment_choice_ranks(matt_dinner_choices, choice_ranks)
choice_ranks = increment_choice_ranks(pam_dinner_choices, choice_ranks)
food rank is: 0
food choice is: pasta
new food_option_rank is: defaultdict(<class 'int'>, {'pasta': 0})
 
food rank is: 1
food choice is: pizza
new food_option_rank is: defaultdict(<class 'int'>, {'pasta': 0, 'pizza': 1})
 
food rank is: 2
food choice is: salad
new food_option_rank is: defaultdict(<class 'int'>, {'pasta': 0, 'pizza': 1, 'salad': 2})
 
food rank is: 3
food choice is: burger
new food_option_rank is: defaultdict(<class 'int'>, {'pasta': 0, 'pizza': 1, 'salad': 2, 'burger': 3})
 
food rank is: 0
food choice is: burger
new food_option_rank is: defaultdict(<class 'int'>, {'pasta': 0, 'pizza': 1, 'salad': 2, 'burger': 3})
 
food rank is: 1
food choice is: pizza
new food_option_rank is: defaultdict(<class 'int'>, {'pasta': 0, 'pizza': 2, 'salad': 2, 'burger': 3})
 
food rank is: 2
food choice is: pasta
new food_option_rank is: defaultdict(<class 'int'>, {'pasta': 2, 'pizza': 2, 'salad': 2, 'burger': 3})
 
food rank is: 3
food choice is: salad
new food_option_rank is: defaultdict(<class 'int'>, {'pasta': 2, 'pizza': 2, 'salad': 5, 'burger': 3})
 
food rank is: 0
food choice is: salad
new food_option_rank is: defaultdict(<class 'int'>, {'pasta': 2, 'pizza': 2, 'salad': 5, 'burger': 3})
 
food rank is: 1
food choice is: pasta
new food_option_rank is: defaultdict(<class 'int'>, {'pasta': 3, 'pizza': 2, 'salad': 5, 'burger': 3})
 
food rank is: 2
food choice is: burger
new food_option_rank is: defaultdict(<class 'int'>, {'pasta': 3, 'pizza': 2, 'salad': 5, 'burger': 5})
 
food rank is: 3
food choice is: pizza
new food_option_rank is: defaultdict(<class 'int'>, {'pasta': 3, 'pizza': 5, 'salad': 5, 'burger': 5})
 
food rank is: 0
food choice is: pizza
new food_option_rank is: defaultdict(<class 'int'>, {'pasta': 3, 'pizza': 5, 'salad': 5, 'burger': 5})
 
food rank is: 1
food choice is: pasta
new food_option_rank is: defaultdict(<class 'int'>, {'pasta': 4, 'pizza': 5, 'salad': 5, 'burger': 5})
 
food rank is: 2
food choice is: burger
new food_option_rank is: defaultdict(<class 'int'>, {'pasta': 4, 'pizza': 5, 'salad': 5, 'burger': 7})
 
food rank is: 3
food choice is: salad
new food_option_rank is: defaultdict(<class 'int'>, {'pasta': 4, 'pizza': 5, 'salad': 8, 'burger': 7})
 
In [9]:
choice_ranks
Out[9]:
defaultdict(int, {'burger': 7, 'pasta': 4, 'pizza': 5, 'salad': 8})

Pasta is the winner!!