def broadcast_zip(list1, list2):
    r"""
    Zips elementwise pairs between list1 and list2. Broadcasts
    the first dimension if a single list is of length 1.

    Aliased as bzip

    Args:
        list1 (list):
        list2 (list):

    Returns:
        list: list of pairs

    SeeAlso:
        util_dict.dzip

    Raises:
        ValueError: if the list dimensions are not broadcastable

    Example:
        >>> # ENABLE_DOCTEST
        >>> from utool.util_list import *  # NOQA
        >>> import utool as ut
        >>> assert list(bzip([1, 2, 3], [4])) == [(1, 4), (2, 4), (3, 4)]
        >>> assert list(bzip([1, 2, 3], [4, 4, 4])) == [(1, 4), (2, 4), (3, 4)]
        >>> assert list(bzip([1], [4, 4, 4])) == [(1, 4), (1, 4), (1, 4)]
        >>> ut.assert_raises(ValueError, bzip, [1, 2, 3], [])
        >>> ut.assert_raises(ValueError, bzip, [], [4, 5, 6])
        >>> ut.assert_raises(ValueError, bzip, [], [4])
        >>> ut.assert_raises(ValueError, bzip, [1, 2], [4, 5, 6])
        >>> ut.assert_raises(ValueError, bzip, [1, 2, 3], [4, 5])
    """
    try:
        len(list1)
    except TypeError:
        list1 = list(list1)
    try:
        len(list2)
    except TypeError:
        list2 = list(list2)
    # if len(list1) == 0 or len(list2) == 0:
    #     # Corner case where either list is empty
    #     return []
    if len(list1) == 1 and len(list2) > 1:
        list1 = list1 * len(list2)
    elif len(list1) > 1 and len(list2) == 1:
        list2 = list2 * len(list1)
    elif len(list1) != len(list2):
        raise ValueError('out of alignment len(list1)=%r, len(list2)=%r' % (
            len(list1), len(list2)))
    # return list(zip(list1, list2))
    return zip(list1, list2)
r"""
    Zips elementwise pairs between list1 and list2. Broadcasts
    the first dimension if a single list is of length 1.

    Aliased as bzip

    Args:
        list1 (list):
        list2 (list):

    Returns:
        list: list of pairs

    SeeAlso:
        util_dict.dzip

    Raises:
        ValueError: if the list dimensions are not broadcastable

    Example:
        >>> # ENABLE_DOCTEST
        >>> from utool.util_list import *  # NOQA
        >>> import utool as ut
        >>> assert list(bzip([1, 2, 3], [4])) == [(1, 4), (2, 4), (3, 4)]
        >>> assert list(bzip([1, 2, 3], [4, 4, 4])) == [(1, 4), (2, 4), (3, 4)]
        >>> assert list(bzip([1], [4, 4, 4])) == [(1, 4), (1, 4), (1, 4)]
        >>> ut.assert_raises(ValueError, bzip, [1, 2, 3], [])
        >>> ut.assert_raises(ValueError, bzip, [], [4, 5, 6])
        >>> ut.assert_raises(ValueError, bzip, [], [4])
        >>> ut.assert_raises(ValueError, bzip, [1, 2], [4, 5, 6])
        >>> ut.assert_raises(ValueError, bzip, [1, 2, 3], [4, 5])