<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_route_edge_attributes(G, route, attribute=None, minimize_key='length', retrieve_default=None):
 """ Get a list of attribute values for each edge in a path. Parameters G : networkx multidigraph route : list list of nodes in the path attribute : string the name of the attribute to get the value of for each edge. If not specified, the complete data dict is returned for each edge. minimize_key : string if there are parallel edges between two nodes, select the one with the lowest value of minimize_key retrieve_default : Callable[Tuple[Any, Any], Any] Function called with the edge nodes as parameters to retrieve a default value, if the edge does not contain the given attribute. Per default, a `KeyError` is raised Returns ------- attribute_values : list list of edge attribute values """


    attribute_values = []
    for u, v in zip(route[:-1], route[1:]):
        # if there are parallel edges between two nodes, select the one with the
        # lowest value of minimize_key
        data = min(G.get_edge_data(u, v).values(), key=lambda x: x[minimize_key])
        if attribute is None:
            attribute_value = data
        elif retrieve_default is not None:
            attribute_value = data.get(attribute, retrieve_default(u, v))
        else:
            attribute_value = data[attribute]
        attribute_values.append(attribute_value)
    return attribute_values