独特的置换发生器?

时间:2014-03-16 00:48:54

标签: python algorithm permutation

问题:我有一些数字列表,例如[1,1,2]。我需要生成独特的排列。排列为[1,1,2],[1,1,2],[1,2,1],[1,2,1],[2,1,1],[2,1,1]。我只需要生成唯一的排列,即[1,1,2],[1,2,1],[2,1,1]

我的尝试:我的第一次尝试是保留一组现有的排列,并为itertools.permutations生成器创建一个过滤器,该过滤器将使用该集来过滤掉重复项。但是,出于效率原因,我宁愿不首先生成那些排列。即使是12个数字的小清单,也只有1%是唯一的。

我有一个想法的开始,我似乎无法弄清楚:我可以在列表中创建唯一值的排列,即[1,2],将剩余的数字放入所有不同的地方。

感谢您的帮助,并且要明确,我不想过滤掉重复的排列,我想首先只生成唯一的排列。

1 个答案:

答案 0 :(得分:4)

我从previous Stack Overflow answer

改编了这段代码
def distinct_permutations(seq):
  from collections import Counter

  def perm_unique_helper(item_counts, perm, i):
    if i < 0:
      yield tuple(perm)
    else:
      for item in item_counts:
        if item_counts[item] <= 0:
          continue
        perm[i] = item
        item_counts[item] -= 1
        # In Python < 3.3 you can replace the yield from with a loop
        yield from perm_unique_helper(item_counts, perm, i - 1)
        item_counts[item] += 1

  item_counts = Counter(seq)
  L = len(seq)

  return perm_unique_helper(item_counts, [0] * L, L - 1)

我的笔记本电脑无法使用set(permutations(seq))方法执行长度为11的输入序列,但使用此方法可以!