sorts ``item_list`` using key_list

    Args:
        list_ (list): list to sort
        key_list (list): list to sort by
        reverse (bool): sort order is descending (largest first)
                        if reverse is True else acscending (smallest first)

    Returns:
        list : ``list_`` sorted by the values of another ``list``. defaults to
        ascending order

    SeeAlso:
        sortedby2

    Examples:
        >>> # ENABLE_DOCTEST
        >>> import utool
        >>> list_    = [1, 2, 3, 4, 5]
        >>> key_list = [2, 5, 3, 1, 5]
        >>> result = utool.sortedby(list_, key_list, reverse=True)
        >>> print(result)
        [5, 2, 3, 1, 4]

def sortedby(item_list, key_list, reverse=False):
    """ sorts ``item_list`` using key_list

    Args:
        list_ (list): list to sort
        key_list (list): list to sort by
        reverse (bool): sort order is descending (largest first)
                        if reverse is True else acscending (smallest first)

    Returns:
        list : ``list_`` sorted by the values of another ``list``. defaults to
        ascending order

    SeeAlso:
        sortedby2

    Examples:
        >>> # ENABLE_DOCTEST
        >>> import utool
        >>> list_    = [1, 2, 3, 4, 5]
        >>> key_list = [2, 5, 3, 1, 5]
        >>> result = utool.sortedby(list_, key_list, reverse=True)
        >>> print(result)
        [5, 2, 3, 1, 4]

    """
    assert len(item_list) == len(key_list), (
        'Expected same len. Got: %r != %r' % (len(item_list), len(key_list)))
    sorted_list = [item for (key, item) in
                   sorted(list(zip(key_list, item_list)), reverse=reverse)]
    return sorted_list