Python 唯一置换生成器?

Python 唯一置换生成器?,python,algorithm,permutation,Python,Algorithm,Permutation,问题:我有一些数字列表,比如[1,1,2]。我需要生成唯一的排列。排列为[1,1,2],[1,1,2],[1,2,1],[1,2,1],[2,1,1],[2,1,1],[2,1,1]。我只需要生成唯一的排列,即,[1,1,2],[1,2,1],[2,1,1] 我的尝试:我的第一次尝试是保留一组现有排列,并为itertools.permutations生成器创建一个筛选器,该生成器将使用该集合过滤掉重复项。然而,出于效率原因,我不希望首先生成这些排列。即使是12个数字的小列表,也只有1%是唯一的

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

我的尝试:我的第一次尝试是保留一组现有排列,并为
itertools.permutations
生成器创建一个筛选器,该生成器将使用该集合过滤掉重复项。然而,出于效率原因,我不希望首先生成这些排列。即使是12个数字的小列表,也只有1%是唯一的

我有一个想法,我似乎一路都想不出来:我可以在我的列表中创建唯一值的排列,即,
[1,2]
,将剩余的数字放在所有不同的地方


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

我将此代码改编自:

def不同排列(seq):
从收款进口柜台
def perm_unique_helper(项目计数、perm、i):
如果i<0:
产量元组(perm)
其他:
对于项目_计数中的项目:

如果item_计数[item],这里已经提到了这一点,请告诉我们,您可以使用什么样的最佳算法来过滤一些重复项?我想知道这一点,以考虑一个更好的预防算法,如果存在的话。还有一个python的答案是ebarr,这里提出的解决方案似乎不起作用。我用Python实现了它,它实际上不生成任何排列。我想我也明白了原因:函数是递归的。当使用空集调用时,它返回一个空集。在执行期间,如果其子调用返回一个空集,则返回一个空集。因此,它深入研究,用一个空集调用自己,然后返回空集。我可能实现错了,因为它只是psuedo代码。。。如果需要,我可以展示我的python实现。jrennie,这要求您在内存中拥有完整的排列列表,以便将其转换为一个集合。有11项将占用我机器全部4gb内存。我可以在596gb的硬盘上存储13个项目。15项,我将不得不求助于在某个服务器场上以120tb的速度处理列表。。。实际上,我有256个项目,我需要几个存储空间来存储排列。(具体来说,我们宇宙中的每个原子都需要一个宇宙,这些宇宙中的每个原子都需要为我存储一个整数。)
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)