code: def _merge_similar(loci, loci_similarity):
      n_cluster = 0
      internal_cluster = {}
      clus_seen = {}
      loci_sorted = sorted(loci_similarity.iteritems(), key=operator.itemgetter(1), reverse=True)
      for pairs, sim in loci_sorted:
          common = sim > parameters.similar
          n_cluster += 1
          logger.debug("_merge_similar:try new cluster %s" % n_cluster)
          new_c = cluster(n_cluster)
          p_seen, p_unseen = [], []
          size = min(len(_get_seqs(loci[pairs[0]])), len(_get_seqs(loci[pairs[1]])))
          if common:
              consistent = _is_consistent(pairs, common, clus_seen, loci_similarity)
              logger.debug("_merge_similar: clusters seen: %s" % clus_seen)
              logger.debug("_merge_similar: id %s common %s|%s total  %s consistent %s" % (pairs, sim, common, size, consistent))
              if not consistent:
                  continue
              if pairs[0] in clus_seen:
                  p_seen.append(pairs[0])
                  p_unseen.append(pairs[1])
              if pairs[1] in clus_seen:
                  p_seen.append(pairs[1])
                  p_unseen.append(pairs[0])
              if len(p_seen) == 0:
                  new_c = _merge_cluster(loci[pairs[0]], new_c)
                  new_c = _merge_cluster(loci[pairs[1]], new_c)
                  [clus_seen.update({p: n_cluster}) for p in pairs]
                  internal_cluster[n_cluster] = new_c
              if len(p_seen) == 1:
                  idc_seen = clus_seen[p_seen[0]]
                  internal_cluster[idc_seen] = _merge_cluster(loci[p_unseen[0]], internal_cluster[idc_seen])
                  clus_seen[p_unseen[0]] = idc_seen
          else:
              logger.debug("_merge_similar: id %s %s  are different" % pairs)
              continue
      internal_cluster.update(_add_unseen(loci, clus_seen, n_cluster))
      logger.debug("_merge_similar: total clus %s" %
                   len(internal_cluster.keys()))
      return internal_cluster