- 5.1 Introduction
- 5.2 Lists
- 5.3 Tuples
- 5.4 Unpacking Sequences
- 5.5 Sequence Slicing
- 5.6 del Statement
- 5.7 Passing Lists to Functions
- 5.8 Sorting Lists
- 5.9 Searching Sequences
- 5.10 Other List Methods
- 5.11 Simulating Stacks with Lists
- 5.12 List Comprehensions
- 5.13 Generator Expressions
- 5.14 Filter, Map and Reduce
- 5.15 Other Sequence Processing Functions
- 5.16 Two-Dimensional Lists
- 5.17 Intro to Data Science: Simulation and Static Visualizations
- 5.18 Wrap-Up
5.15 Other Sequence Processing Functions
Python provides other built-in functions for manipulating sequences.
Finding the Minimum and Maximum Values Using a Key Function
We’ve previously shown the built-in reduction functions min and max using arguments, such as ints or lists of ints. Sometimes you’ll need to find the minimum and maximum of more complex objects, such as strings. Consider the following comparison:
In [1]: 'Red' < 'orange' Out[1]: True
The letter 'R' “comes after” 'o' in the alphabet, so you might expect 'Red' to be less than 'orange' and the condition above to be False. However, strings are compared by their characters’ underlying numerical values, and lowercase letters have higher numerical values than uppercase letters. You can confirm this with built-in function ord, which returns the numerical value of a character:
In [2]: ord('R') Out[2]: 82 In [3]: ord('o') Out[3]: 111
Consider the list colors, which contains strings with uppercase and lowercase letters:
In [4]: colors = ['Red', 'orange', 'Yellow', 'green', 'Blue']
Let’s assume that we’d like to determine the minimum and maximum strings using alphabetical order, not numerical (lexicographical) order. If we arrange colors alphabetically
'Blue', 'green', 'orange', 'Red', 'Yellow'
you can see that 'Blue' is the minimum (that is, closest to the beginning of the alphabet), and 'Yellow' is the maximum (that is, closest to the end of the alphabet).
Since Python compares strings using numerical values, you must first convert each string to all lowercase or all uppercase letters. Then their numerical values will also represent alphabetical ordering. The following snippets enable min and max to determine the minimum and maximum strings alphabetically:
In [5]: min(colors, key=lambda s: s.lower()) Out[5]: 'Blue' In [6]: max(colors, key=lambda s: s.lower()) Out[6]: 'Yellow'
The key keyword argument must be a one-parameter function that returns a value. In this case, it’s a lambda that calls string method lower to get a string’s lowercase version. Functions min and max call the key argument’s function for each element and use the results to compare the elements.
Iterating Backward Through a Sequence
Built-in function reversed returns an iterator that enables you to iterate over a sequence’s values backward. The following list comprehension creates a new list containing the squares of numbers’ values in reverse order:
In [7]: numbers = [10, 3, 7, 1, 9, 4, 2, 8, 5, 6] In [7]: reversed_numbers = [item for item in reversed(numbers)] In [8]: reversed_numbers Out[8]: [36, 25, 64, 4, 16, 81, 1, 49, 9, 100]
Combining Iterables into Tuples of Corresponding Elements
Built-in function zip enables you to iterate over multiple iterables of data at the same time. The function receives as arguments any number of iterables and returns an iterator that produces tuples containing the elements at the same index in each. For example, snippet [11]’s call to zip produces the tuples ('Bob', 3.5), ('Sue', 4.0) and ('Amanda', 3.75) consisting of the elements at index 0, 1 and 2 of each list, respectively:
In [9]: names = ['Bob', 'Sue', 'Amanda'] In [10]: grade_point_averages = [3.5, 4.0, 3.75] In [11]: for name, gpa in zip(names, grade_point_averages): ...: print(f'Name={name}; GPA={gpa}') ...: Name=Bob; GPA=3.5 Name=Sue; GPA=4.0 Name=Amanda; GPA=3.75
We unpack each tuple into name and gpa and display them. Function zip’s shortest argument determines the number of tuples produced. Here both have the same length.