【问题标题】:Code for generating all unique permutations recursively?递归生成所有唯一排列的代码?
【发布时间】:2012-11-04 16:24:54
【问题描述】:

假设我有一个列表L=[1,2,3,3,4],我想递归地找到所有长度为 3 的排列。

我正在尝试返回所有唯一的排列,这意味着像 [1,2,3] 这样的东西不会两次包含在输出中,因为在 L 中有两个 3

我问是因为 itertools.permutations 包含重复项,而且我试图按顺序迭代排列(从最低的 [1,2,3] 迭代到 [4,3,3]),因为我希望能够在需要时退出迭代到。

如果我没有正确解释事情,我很抱歉。

编辑:我可能应该再次详细说明。在实践中,我不想实际生成每一个可能的排列(会有太多的排列),尽管代码可以运行完成。我正在尝试以特定顺序遍历所有排列,以便在必要时可以提前退出。

【问题讨论】:

  • 您想避免重复[1, 2, 3],但您还想在输出中包含[4, 3, 3]?也许这是可能的,但对我来说似乎不一致......
  • @senderle Well [1,2,3] 可能与另一个 [1,2,3] 重复。 [4,3,3] 本身仍然是一个有效的排列。
  • 是的,但在一种情况下,您将3s 视为相同,而在另一种情况下,您将它们视为不同。做一个事后过滤器并不难,但我很难看到你如何only 生成你想要的值。您如何判断何时将3s 视为相同,何时将它们视为不同?同样,也许这是可能的,但我不确定好处是否超过了复杂性的增加。

标签: python permutation


【解决方案1】:

这个怎么样:

l = [1,2,3,3,4]

print sorted(set(itertools.permutations(l,3)))

输出:

[(1, 2, 3), (1, 2, 4), (1, 3, 2), (1, 3, 3), (1, 3, 4), ..., (4, 3, 3)]

这样可以保持有序并删除重复项。


如果您想避免预先生成每个可能的排列,我会这样做:

gen = itertools.permutations(l,3)
s = set()

for i in gen:
    if i not in s:
        print i  # or do anything else
    # if some_cond: break
    s.add(i)

这里gen 是一个生成器,因此您不会预先创建所有可能使用的元素。

【讨论】:

  • 这不允许我在需要时快速迭代并退出子循环。如果可能的话,我正在寻找一种递归类型的方法。
  • @johnsmith - 我认为你需要澄清你打算“纾困”的条件。
  • @JohnSmith 为什么不能迭代?另外,我强烈建议不要重新发明轮子并尽可能使用itertools(因为它正是为此而制作/优化的)。
  • @Aesthete 每个排列都被用作另一个函数中的参数,但是如果 [1,2,3] 不起作用,那么 [1,2,4] 或 [1, 2,5] 或 [1,2,6] 等,所以我提早放弃并从 [1,3,2] 或类似的东西开始。 Itertools 不允许我在这里做我想做的事,尤其是因为它使用重复项。
  • +1,因为我想不出比第二个事后过滤器更好的方法来解决这个问题。不过它会开始消耗大量内存!就个人而言,如果没有强烈的反对意见,我只会忍受一些重复,直接使用itertools.permutations 的输出。
猜你喜欢
  • 2012-03-14
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多