docs: def dzip(list1, list2):
      r"""
      Zips elementwise pairs between list1 and list2 into a dictionary. Values
      from list2 can be broadcast onto list1.
  
      Args:
          list1 (sequence): full sequence
          list2 (sequence): can either be a sequence of one item or a sequence of
              equal length to `list1`
  
      SeeAlso:
          util_list.broadcast_zip
  
      Returns:
          dict: similar to dict(zip(list1, list2))
  
      CommandLine:
          python -m utool.util_dict dzip
  
      Example:
          >>> # DISABLE_DOCTEST
          >>> from utool.util_dict import *  # NOQA
          >>> import utool as ut
          >>> assert dzip([1, 2, 3], [4]) == {1: 4, 2: 4, 3: 4}
          >>> assert dzip([1, 2, 3], [4, 4, 4]) == {1: 4, 2: 4, 3: 4}
          >>> ut.assert_raises(ValueError, dzip, [1, 2, 3], [])
          >>> ut.assert_raises(ValueError, dzip, [], [4, 5, 6])
          >>> ut.assert_raises(ValueError, dzip, [], [4])
          >>> ut.assert_raises(ValueError, dzip, [1, 2], [4, 5, 6])
          >>> ut.assert_raises(ValueError, dzip, [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 and len(list2) == 1:
          # Corner case:
          # allow the first list to be empty and the second list to broadcast a
          # value. This means that the equality check wont work for the case
          # where list1 and list2 are supposed to correspond, but the length of
          # list2 is 1.
          list2 = []
      if len(list2) == 1 and len(list1) > 1:
          list2 = list2 * len(list1)
      if len(list1) != len(list2):
          raise ValueError('out of alignment len(list1)=%r, len(list2)=%r' % (
              len(list1), len(list2)))
      return dict(zip(list1, list2))