【发布时间】:2014-04-21 07:35:57
【问题描述】:
问题:我有一些数字列表,例如[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],将剩余的数字放在所有不同的地方.
感谢您的帮助,明确地说,我不想过滤掉重复的排列,我只想首先生成唯一的排列。
【问题讨论】:
-
您能否告诉您可以用来过滤某些重复项的最佳算法的顺序是什么?我想知道这一点,以便考虑一种具有更好顺序的预防算法(如果存在)。
-
这里还有一个python答案stackoverflow.com/questions/6284396/…
-
ebarr,那里提出的解决方案似乎不起作用。我在 Python 中实现了它,它实际上并没有生成任何排列。我想我也明白了原因:函数是递归的。当用空集调用时,它返回一个空集。在执行过程中,如果它的子调用返回一个空集,它就会返回一个空集。因此,它深入研究,用一个空集调用自己,然后一直返回空集。我可能实现错了,因为它只是伪代码......如果需要,我可以展示我的 python 实现。
-
jrennie,这需要您在内存中拥有整个排列列表才能将其转换为集合。有 11 件物品会占用我机器内存的全部 4GB。我可以在 596GB 的硬盘上存储 13 件物品。 15 个项目,我将不得不求助于以 120 tb 处理某个服务器场上的列表...实际上,我有 256 个项目,我需要多个存储空间来存储排列。 (具体来说,我们的宇宙中的每个原子都需要一个宇宙,而这些宇宙中的每个原子都需要为我存储 1 个整数。)
标签: python algorithm permutation