"""Utilities for Maps""" from math import sqrt from random import sample # Rename the built-in zip (http://docs.python.org/3/library/functions.html#zip) _zip = zip def map_and_filter(s, mapper, filterer): """Return a new list containing the result of calling mapper on each element of sequence s for which filterer returns a true value. >>> square = lambda x: x * x >>> is_odd = lambda x: x % 2 == 1 >>> map_and_filter([1, 2, 3, 4, 5], square, is_odd) [1, 9, 25] """ # BEGIN Question 0 return [mapper(x) for x in s if filterer(x)] # END Question 0 def key_of_min_value(d): """Returns the key in dict d that corresponds to the minimum value of d. >>> letters = {'a': 6, 'b': 5, 'c': 4, 'd': 5} >>> min(letters) 'a' >>> key_of_min_value(letters) 'c' """ # BEGIN Question 0 return min(d, key=d.get) # END Question 0 def zip(*sequences): """Returns a list of lists, where the i-th list contains the i-th element from each of the argument sequences. >>> zip(range(0, 3), range(3, 6)) [[0, 3], [1, 4], [2, 5]] >>> for a, b in zip([1, 2, 3], [4, 5, 6]): ... print(a, b) 1 4 2 5 3 6 >>> for triple in zip(['a', 'b', 'c'], [1, 2, 3], ['do', 're', 'mi']): ... print(triple) ['a', 1, 'do'] ['b', 2, 're'] ['c', 3, 'mi'] """ return list(map(list, _zip(*sequences))) def enumerate(s, start=0): """Returns a list of lists, where the i-th list contains i+start and the i-th element of s. >>> enumerate([6, 1, 'a']) [[0, 6], [1, 1], [2, 'a']] >>> enumerate('five', 5) [[5, 'f'], [6, 'i'], [7, 'v'], [8, 'e']] """ # BEGIN Question 0 return zip(range(start, start + len(s) - 1), s) # END Question 0 def distance(pos1, pos2): """Return the Euclidean distance between pos1 and pos2, which are pairs. >>> distance([1, 2], [4, 6]) 5.0 """ return sqrt((pos1[0] - pos2[0]) ** 2 + (pos1[1] - pos2[1]) ** 2) def mean(s): """Return the arithmetic mean of a sequence of numbers s. >>> mean([-1, 3]) 1.0 >>> mean([0, -3, 2, -1]) -0.5 """ assert len(s) > 0, 'cannot find mean of empty sequence' return sum(s) / len(s)