Functional Python Programming

(Wang) #1

Higher-order Functions


Using sorted() to put data in order


When we need to produce results in a defined order, Python gives us two choices.
We can create a list object and use the list.sort() method to put items in an
order. An alternative is to use the sorted() function. This function works with any
iterable, but it creates a final list object as part of the sorting operation.


The sorted() function can be used in two ways. It can be simply applied to
collections. It can also be used as a higher-order function using the key= argument.


Let's say we have our trip data from the examples in Chapter 4, Working with Collections.
We have a function that will generate a sequence of tuples with start, end, and distance
for each leg of a trip. The data looks as follows:


(((37.54901619777347, -76.33029518659048), (37.840832, -76.273834),
17.7246), ((37.840832, -76.273834), (38.331501, -76.459503),
30.7382), ((38.331501, -76.459503), (38.845501, -76.537331),
31.0756), ((36.843334, -76.298668), (37.549, -76.331169), 42.3962),
((37.549, -76.331169), (38.330166, -76.458504), 47.2866),
((38.330166, -76.458504), (38.976334, -76.473503), 38.8019))


We can see the default behavior of the sorted() function using the following
interaction:





sorted(dist(x) for x in trip)





[0.1731, 0.1898, 1.4235, 4.3155, ... 86.2095, 115.1751, 129.7748]


We used a generator expression (dist(x) for x in trip) to extract the distances
from our trip data. We then sorted this iterable collection of numbers to get the
distances from 0.17 nm to 129.77 nm.


If we want to keep the legs and distances together in their original three tuples, we
can have the sorted() function apply a key() function to determine how to sort the
tuples, as shown in the following code snippet:





sorted(trip, key=dist)





[((35.505665, -76.653664), (35.508335, -76.654999), 0.1731),
((35.028175, -76.682495), (35.031334, -76.682663), 0.1898),
((27.154167, -80.195663), (29.195168, -81.002998), 129.7748)]


We've sorted the trip data, using a dist lambda to extract the distance from each
tuple. The dist function is simply as follows:


dist = lambda leg: leg[2]


This shows the power of using simple lambda to decompose a complex tuple into
constituent elements.

Free download pdf