code: def _merge_batches(all_groups):
      
      merged = []
      while len(all_groups) > 0:
          first, rest = all_groups[0], all_groups[1:]
          first = set(first)
          lf = -1
          while len(first) > lf:
              lf = len(first)
  
              rest2 = []
              for r in rest:
                  if len(first.intersection(set(r))) > 0:
                      first |= set(r)
                  else:
                      rest2.append(r)
              rest = rest2
          merged.append(first)
          all_groups = rest
      return merged
docs: Merge batches with overlapping groups. Uses merge approach from:
  
      http://stackoverflow.com/a/4842897/252589