docs: def sample_zip(items_list, num_samples, allow_overflow=False, per_bin=1):
      """ Helper for sampling
  
      Given a list of lists, samples one item for each list and bins them into
      num_samples bins. If all sublists are of equal size this is equivilent to a
      zip, but otherewise consecutive bins will have monotonically less
      elemements
  
      # Doctest doesn't work with assertionerror
      #util_list.sample_zip(items_list, 2)
      #...
      #AssertionError: Overflow occured
  
      Args:
          items_list (list):
          num_samples (?):
          allow_overflow (bool):
          per_bin (int):
  
      Returns:
          tuple : (samples_list, overflow_samples)
  
      Examples:
          >>> # DISABLE_DOCTEST
          >>> from utool import util_list
          >>> items_list = [[1, 2, 3, 4, 0], [5, 6, 7], [], [8, 9], [10]]
          >>> util_list.sample_zip(items_list, 5)
          ...
          [[1, 5, 8, 10], [2, 6, 9], [3, 7], [4], [0]]
          >>> util_list.sample_zip(items_list, 2, allow_overflow=True)
          ...
          ([[1, 5, 8, 10], [2, 6, 9]], [3, 7, 4])
          >>> util_list.sample_zip(items_list, 4, allow_overflow=True, per_bin=2)
          ...
          ([[1, 5, 8, 10, 2, 6, 9], [3, 7, 4], [], []], [0])
      """
      # Prealloc a list of lists
      samples_list = [[] for _ in range(num_samples)]
      # Sample the ix-th value from every list
      samples_iter = zip_longest(*items_list)
      sx = 0
      for ix, samples_ in zip(range(num_samples), samples_iter):
          samples = filter_Nones(samples_)
          samples_list[sx].extend(samples)
          # Put per_bin from each sublist into a sample
          if (ix + 1) % per_bin == 0:
              sx += 1
      # Check for overflow
      if allow_overflow:
          overflow_samples = flatten([filter_Nones(samples_) for samples_ in samples_iter])
          return samples_list, overflow_samples
      else:
          try:
              samples_iter.next()
          except StopIteration:
              pass
          else:
              raise AssertionError('Overflow occured')
          return samples_list