【问题标题】:Using itertools combination and permutation functions to count for repeated elements使用 itertools 组合和排列函数计算重复元素
【发布时间】:2020-02-18 03:29:17
【问题描述】:

我需要使用 itertools 模块来查找 "O"s 和 "X"s 的 n 个元素序列的排列总数。 (n 将是一个已知常数,但请给出 n=8 的答案)。例如,如果我输入 3,它应该输出:

OOO
OOX
OXO
XOO
OXX
XXO
XOX
XXX

不一定按这个顺序。我目前正在使用 itertools 及其组合/排列/组合_with_replacement 函数来执行此操作,但似乎无法弄清楚如果我给它一个包含多个相同元素的数组,它们是相同的。要找到组合,我很棒,我目前可以这样做:

comb = combinations_with_replacement(["O", "X"], 8)

哪个输出

('O', 'O', 'O', 'O', 'O', 'O', 'O', 'O')
('O', 'O', 'O', 'O', 'O', 'O', 'O', 'X')
('O', 'O', 'O', 'O', 'O', 'O', 'X', 'X')
('O', 'O', 'O', 'O', 'O', 'X', 'X', 'X')
('O', 'O', 'O', 'O', 'X', 'X', 'X', 'X')
('O', 'O', 'O', 'X', 'X', 'X', 'X', 'X')
('O', 'O', 'X', 'X', 'X', 'X', 'X', 'X')
('O', 'X', 'X', 'X', 'X', 'X', 'X', 'X')
('X', 'X', 'X', 'X', 'X', 'X', 'X', 'X')

但是,当我使用 permutations 函数时,它会区分相等的元素,使得有 8 个阶乘乘以 9 = 40320 乘以 9 个输出元组,而应该只有 2^8=256 个输出。有人可以帮忙吗?

谢谢!


编辑:我还需要实际生成排列。不只是找出他们的总数。

【问题讨论】:

  • 所以你找到了combination_with_replacement() 的解决方案,你只是想知道为什么permutation 会给你这个结果?
  • 不,我仍然想要不同的排列,而不是组合。例如,现在它认为 ["O", "O","O", "O","O", "O","O", "O"] 与 ["O" , "O","O", "O","O", "O","O", "O"],这显然是错误的。它将“O”与“O”区分开来,这就是它发生的原因。但是,我仍然想将 ["X", "O","O", "O","O", "O","O", "O"] 与 ["O", "X", “O”、“O”、“O”、“O”、“O”、“O”]。我不只想要组合,它只会给我 9 个输出。所以我找到了解决方案的开始,但我仍然需要帮助完成它
  • 2**n 有什么问题?
  • 没什么问题……只是不给力。
  • 不给什么?

标签: python algorithm combinations permutation


【解决方案1】:

您可以使用itertools.product 和repeat 参数来获得您想要的输出:

for xos in itertools.product('OX', repeat=3):
    print(xos)

给予:

('O', 'O', 'O')
('O', 'O', 'X')
('O', 'X', 'O')
('O', 'X', 'X')
('X', 'O', 'O')
('X', 'O', 'X')
('X', 'X', 'O')
('X', 'X', 'X')

对于repeat=8,您将获得 256 个结果:

('O', 'O', 'O', 'O', 'O', 'O', 'O', 'O')
('O', 'O', 'O', 'O', 'O', 'O', 'O', 'X')
('O', 'O', 'O', 'O', 'O', 'O', 'X', 'O')
('O', 'O', 'O', 'O', 'O', 'O', 'X', 'X')
('O', 'O', 'O', 'O', 'O', 'X', 'O', 'O')
('O', 'O', 'O', 'O', 'O', 'X', 'O', 'X')
('O', 'O', 'O', 'O', 'O', 'X', 'X', 'O')
('O', 'O', 'O', 'O', 'O', 'X', 'X', 'X')
('O', 'O', 'O', 'O', 'X', 'O', 'O', 'O')
('O', 'O', 'O', 'O', 'X', 'O', 'O', 'X')
('O', 'O', 'O', 'O', 'X', 'O', 'X', 'O')
('O', 'O', 'O', 'O', 'X', 'O', 'X', 'X')
('O', 'O', 'O', 'O', 'X', 'X', 'O', 'O')
('O', 'O', 'O', 'O', 'X', 'X', 'O', 'X')
('O', 'O', 'O', 'O', 'X', 'X', 'X', 'O')
('O', 'O', 'O', 'O', 'X', 'X', 'X', 'X')
('O', 'O', 'O', 'X', 'O', 'O', 'O', 'O')
('O', 'O', 'O', 'X', 'O', 'O', 'O', 'X')
('O', 'O', 'O', 'X', 'O', 'O', 'X', 'O')
('O', 'O', 'O', 'X', 'O', 'O', 'X', 'X')
('O', 'O', 'O', 'X', 'O', 'X', 'O', 'O')
('O', 'O', 'O', 'X', 'O', 'X', 'O', 'X')
('O', 'O', 'O', 'X', 'O', 'X', 'X', 'O')
('O', 'O', 'O', 'X', 'O', 'X', 'X', 'X')
('O', 'O', 'O', 'X', 'X', 'O', 'O', 'O')
('O', 'O', 'O', 'X', 'X', 'O', 'O', 'X')
('O', 'O', 'O', 'X', 'X', 'O', 'X', 'O')
('O', 'O', 'O', 'X', 'X', 'O', 'X', 'X')
('O', 'O', 'O', 'X', 'X', 'X', 'O', 'O')
('O', 'O', 'O', 'X', 'X', 'X', 'O', 'X')
('O', 'O', 'O', 'X', 'X', 'X', 'X', 'O')
('O', 'O', 'O', 'X', 'X', 'X', 'X', 'X')
('O', 'O', 'X', 'O', 'O', 'O', 'O', 'O')
('O', 'O', 'X', 'O', 'O', 'O', 'O', 'X')
('O', 'O', 'X', 'O', 'O', 'O', 'X', 'O')
('O', 'O', 'X', 'O', 'O', 'O', 'X', 'X')
('O', 'O', 'X', 'O', 'O', 'X', 'O', 'O')
('O', 'O', 'X', 'O', 'O', 'X', 'O', 'X')
('O', 'O', 'X', 'O', 'O', 'X', 'X', 'O')
('O', 'O', 'X', 'O', 'O', 'X', 'X', 'X')
('O', 'O', 'X', 'O', 'X', 'O', 'O', 'O')
('O', 'O', 'X', 'O', 'X', 'O', 'O', 'X')
('O', 'O', 'X', 'O', 'X', 'O', 'X', 'O')
('O', 'O', 'X', 'O', 'X', 'O', 'X', 'X')
('O', 'O', 'X', 'O', 'X', 'X', 'O', 'O')
('O', 'O', 'X', 'O', 'X', 'X', 'O', 'X')
('O', 'O', 'X', 'O', 'X', 'X', 'X', 'O')
('O', 'O', 'X', 'O', 'X', 'X', 'X', 'X')
('O', 'O', 'X', 'X', 'O', 'O', 'O', 'O')
('O', 'O', 'X', 'X', 'O', 'O', 'O', 'X')
('O', 'O', 'X', 'X', 'O', 'O', 'X', 'O')
('O', 'O', 'X', 'X', 'O', 'O', 'X', 'X')
('O', 'O', 'X', 'X', 'O', 'X', 'O', 'O')
('O', 'O', 'X', 'X', 'O', 'X', 'O', 'X')
('O', 'O', 'X', 'X', 'O', 'X', 'X', 'O')
('O', 'O', 'X', 'X', 'O', 'X', 'X', 'X')
('O', 'O', 'X', 'X', 'X', 'O', 'O', 'O')
('O', 'O', 'X', 'X', 'X', 'O', 'O', 'X')
('O', 'O', 'X', 'X', 'X', 'O', 'X', 'O')
('O', 'O', 'X', 'X', 'X', 'O', 'X', 'X')
('O', 'O', 'X', 'X', 'X', 'X', 'O', 'O')
('O', 'O', 'X', 'X', 'X', 'X', 'O', 'X')
('O', 'O', 'X', 'X', 'X', 'X', 'X', 'O')
('O', 'O', 'X', 'X', 'X', 'X', 'X', 'X')
('O', 'X', 'O', 'O', 'O', 'O', 'O', 'O')
('O', 'X', 'O', 'O', 'O', 'O', 'O', 'X')
('O', 'X', 'O', 'O', 'O', 'O', 'X', 'O')
('O', 'X', 'O', 'O', 'O', 'O', 'X', 'X')
('O', 'X', 'O', 'O', 'O', 'X', 'O', 'O')
('O', 'X', 'O', 'O', 'O', 'X', 'O', 'X')
('O', 'X', 'O', 'O', 'O', 'X', 'X', 'O')
('O', 'X', 'O', 'O', 'O', 'X', 'X', 'X')
('O', 'X', 'O', 'O', 'X', 'O', 'O', 'O')
('O', 'X', 'O', 'O', 'X', 'O', 'O', 'X')
('O', 'X', 'O', 'O', 'X', 'O', 'X', 'O')
('O', 'X', 'O', 'O', 'X', 'O', 'X', 'X')
('O', 'X', 'O', 'O', 'X', 'X', 'O', 'O')
('O', 'X', 'O', 'O', 'X', 'X', 'O', 'X')
('O', 'X', 'O', 'O', 'X', 'X', 'X', 'O')
('O', 'X', 'O', 'O', 'X', 'X', 'X', 'X')
('O', 'X', 'O', 'X', 'O', 'O', 'O', 'O')
('O', 'X', 'O', 'X', 'O', 'O', 'O', 'X')
('O', 'X', 'O', 'X', 'O', 'O', 'X', 'O')
('O', 'X', 'O', 'X', 'O', 'O', 'X', 'X')
('O', 'X', 'O', 'X', 'O', 'X', 'O', 'O')
('O', 'X', 'O', 'X', 'O', 'X', 'O', 'X')
('O', 'X', 'O', 'X', 'O', 'X', 'X', 'O')
('O', 'X', 'O', 'X', 'O', 'X', 'X', 'X')
('O', 'X', 'O', 'X', 'X', 'O', 'O', 'O')
('O', 'X', 'O', 'X', 'X', 'O', 'O', 'X')
('O', 'X', 'O', 'X', 'X', 'O', 'X', 'O')
('O', 'X', 'O', 'X', 'X', 'O', 'X', 'X')
('O', 'X', 'O', 'X', 'X', 'X', 'O', 'O')
('O', 'X', 'O', 'X', 'X', 'X', 'O', 'X')
('O', 'X', 'O', 'X', 'X', 'X', 'X', 'O')
('O', 'X', 'O', 'X', 'X', 'X', 'X', 'X')
('O', 'X', 'X', 'O', 'O', 'O', 'O', 'O')
('O', 'X', 'X', 'O', 'O', 'O', 'O', 'X')
('O', 'X', 'X', 'O', 'O', 'O', 'X', 'O')
('O', 'X', 'X', 'O', 'O', 'O', 'X', 'X')
('O', 'X', 'X', 'O', 'O', 'X', 'O', 'O')
('O', 'X', 'X', 'O', 'O', 'X', 'O', 'X')
('O', 'X', 'X', 'O', 'O', 'X', 'X', 'O')
('O', 'X', 'X', 'O', 'O', 'X', 'X', 'X')
('O', 'X', 'X', 'O', 'X', 'O', 'O', 'O')
('O', 'X', 'X', 'O', 'X', 'O', 'O', 'X')
('O', 'X', 'X', 'O', 'X', 'O', 'X', 'O')
('O', 'X', 'X', 'O', 'X', 'O', 'X', 'X')
('O', 'X', 'X', 'O', 'X', 'X', 'O', 'O')
('O', 'X', 'X', 'O', 'X', 'X', 'O', 'X')
('O', 'X', 'X', 'O', 'X', 'X', 'X', 'O')
('O', 'X', 'X', 'O', 'X', 'X', 'X', 'X')
('O', 'X', 'X', 'X', 'O', 'O', 'O', 'O')
('O', 'X', 'X', 'X', 'O', 'O', 'O', 'X')
('O', 'X', 'X', 'X', 'O', 'O', 'X', 'O')
('O', 'X', 'X', 'X', 'O', 'O', 'X', 'X')
('O', 'X', 'X', 'X', 'O', 'X', 'O', 'O')
('O', 'X', 'X', 'X', 'O', 'X', 'O', 'X')
('O', 'X', 'X', 'X', 'O', 'X', 'X', 'O')
('O', 'X', 'X', 'X', 'O', 'X', 'X', 'X')
('O', 'X', 'X', 'X', 'X', 'O', 'O', 'O')
('O', 'X', 'X', 'X', 'X', 'O', 'O', 'X')
('O', 'X', 'X', 'X', 'X', 'O', 'X', 'O')
('O', 'X', 'X', 'X', 'X', 'O', 'X', 'X')
('O', 'X', 'X', 'X', 'X', 'X', 'O', 'O')
('O', 'X', 'X', 'X', 'X', 'X', 'O', 'X')
('O', 'X', 'X', 'X', 'X', 'X', 'X', 'O')
('O', 'X', 'X', 'X', 'X', 'X', 'X', 'X')
('X', 'O', 'O', 'O', 'O', 'O', 'O', 'O')
('X', 'O', 'O', 'O', 'O', 'O', 'O', 'X')
('X', 'O', 'O', 'O', 'O', 'O', 'X', 'O')
('X', 'O', 'O', 'O', 'O', 'O', 'X', 'X')
('X', 'O', 'O', 'O', 'O', 'X', 'O', 'O')
('X', 'O', 'O', 'O', 'O', 'X', 'O', 'X')
('X', 'O', 'O', 'O', 'O', 'X', 'X', 'O')
('X', 'O', 'O', 'O', 'O', 'X', 'X', 'X')
('X', 'O', 'O', 'O', 'X', 'O', 'O', 'O')
('X', 'O', 'O', 'O', 'X', 'O', 'O', 'X')
('X', 'O', 'O', 'O', 'X', 'O', 'X', 'O')
('X', 'O', 'O', 'O', 'X', 'O', 'X', 'X')
('X', 'O', 'O', 'O', 'X', 'X', 'O', 'O')
('X', 'O', 'O', 'O', 'X', 'X', 'O', 'X')
('X', 'O', 'O', 'O', 'X', 'X', 'X', 'O')
('X', 'O', 'O', 'O', 'X', 'X', 'X', 'X')
('X', 'O', 'O', 'X', 'O', 'O', 'O', 'O')
('X', 'O', 'O', 'X', 'O', 'O', 'O', 'X')
('X', 'O', 'O', 'X', 'O', 'O', 'X', 'O')
('X', 'O', 'O', 'X', 'O', 'O', 'X', 'X')
('X', 'O', 'O', 'X', 'O', 'X', 'O', 'O')
('X', 'O', 'O', 'X', 'O', 'X', 'O', 'X')
('X', 'O', 'O', 'X', 'O', 'X', 'X', 'O')
('X', 'O', 'O', 'X', 'O', 'X', 'X', 'X')
('X', 'O', 'O', 'X', 'X', 'O', 'O', 'O')
('X', 'O', 'O', 'X', 'X', 'O', 'O', 'X')
('X', 'O', 'O', 'X', 'X', 'O', 'X', 'O')
('X', 'O', 'O', 'X', 'X', 'O', 'X', 'X')
('X', 'O', 'O', 'X', 'X', 'X', 'O', 'O')
('X', 'O', 'O', 'X', 'X', 'X', 'O', 'X')
('X', 'O', 'O', 'X', 'X', 'X', 'X', 'O')
('X', 'O', 'O', 'X', 'X', 'X', 'X', 'X')
('X', 'O', 'X', 'O', 'O', 'O', 'O', 'O')
('X', 'O', 'X', 'O', 'O', 'O', 'O', 'X')
('X', 'O', 'X', 'O', 'O', 'O', 'X', 'O')
('X', 'O', 'X', 'O', 'O', 'O', 'X', 'X')
('X', 'O', 'X', 'O', 'O', 'X', 'O', 'O')
('X', 'O', 'X', 'O', 'O', 'X', 'O', 'X')
('X', 'O', 'X', 'O', 'O', 'X', 'X', 'O')
('X', 'O', 'X', 'O', 'O', 'X', 'X', 'X')
('X', 'O', 'X', 'O', 'X', 'O', 'O', 'O')
('X', 'O', 'X', 'O', 'X', 'O', 'O', 'X')
('X', 'O', 'X', 'O', 'X', 'O', 'X', 'O')
('X', 'O', 'X', 'O', 'X', 'O', 'X', 'X')
('X', 'O', 'X', 'O', 'X', 'X', 'O', 'O')
('X', 'O', 'X', 'O', 'X', 'X', 'O', 'X')
('X', 'O', 'X', 'O', 'X', 'X', 'X', 'O')
('X', 'O', 'X', 'O', 'X', 'X', 'X', 'X')
('X', 'O', 'X', 'X', 'O', 'O', 'O', 'O')
('X', 'O', 'X', 'X', 'O', 'O', 'O', 'X')
('X', 'O', 'X', 'X', 'O', 'O', 'X', 'O')
('X', 'O', 'X', 'X', 'O', 'O', 'X', 'X')
('X', 'O', 'X', 'X', 'O', 'X', 'O', 'O')
('X', 'O', 'X', 'X', 'O', 'X', 'O', 'X')
('X', 'O', 'X', 'X', 'O', 'X', 'X', 'O')
('X', 'O', 'X', 'X', 'O', 'X', 'X', 'X')
('X', 'O', 'X', 'X', 'X', 'O', 'O', 'O')
('X', 'O', 'X', 'X', 'X', 'O', 'O', 'X')
('X', 'O', 'X', 'X', 'X', 'O', 'X', 'O')
('X', 'O', 'X', 'X', 'X', 'O', 'X', 'X')
('X', 'O', 'X', 'X', 'X', 'X', 'O', 'O')
('X', 'O', 'X', 'X', 'X', 'X', 'O', 'X')
('X', 'O', 'X', 'X', 'X', 'X', 'X', 'O')
('X', 'O', 'X', 'X', 'X', 'X', 'X', 'X')
('X', 'X', 'O', 'O', 'O', 'O', 'O', 'O')
('X', 'X', 'O', 'O', 'O', 'O', 'O', 'X')
('X', 'X', 'O', 'O', 'O', 'O', 'X', 'O')
('X', 'X', 'O', 'O', 'O', 'O', 'X', 'X')
('X', 'X', 'O', 'O', 'O', 'X', 'O', 'O')
('X', 'X', 'O', 'O', 'O', 'X', 'O', 'X')
('X', 'X', 'O', 'O', 'O', 'X', 'X', 'O')
('X', 'X', 'O', 'O', 'O', 'X', 'X', 'X')
('X', 'X', 'O', 'O', 'X', 'O', 'O', 'O')
('X', 'X', 'O', 'O', 'X', 'O', 'O', 'X')
('X', 'X', 'O', 'O', 'X', 'O', 'X', 'O')
('X', 'X', 'O', 'O', 'X', 'O', 'X', 'X')
('X', 'X', 'O', 'O', 'X', 'X', 'O', 'O')
('X', 'X', 'O', 'O', 'X', 'X', 'O', 'X')
('X', 'X', 'O', 'O', 'X', 'X', 'X', 'O')
('X', 'X', 'O', 'O', 'X', 'X', 'X', 'X')
('X', 'X', 'O', 'X', 'O', 'O', 'O', 'O')
('X', 'X', 'O', 'X', 'O', 'O', 'O', 'X')
('X', 'X', 'O', 'X', 'O', 'O', 'X', 'O')
('X', 'X', 'O', 'X', 'O', 'O', 'X', 'X')
('X', 'X', 'O', 'X', 'O', 'X', 'O', 'O')
('X', 'X', 'O', 'X', 'O', 'X', 'O', 'X')
('X', 'X', 'O', 'X', 'O', 'X', 'X', 'O')
('X', 'X', 'O', 'X', 'O', 'X', 'X', 'X')
('X', 'X', 'O', 'X', 'X', 'O', 'O', 'O')
('X', 'X', 'O', 'X', 'X', 'O', 'O', 'X')
('X', 'X', 'O', 'X', 'X', 'O', 'X', 'O')
('X', 'X', 'O', 'X', 'X', 'O', 'X', 'X')
('X', 'X', 'O', 'X', 'X', 'X', 'O', 'O')
('X', 'X', 'O', 'X', 'X', 'X', 'O', 'X')
('X', 'X', 'O', 'X', 'X', 'X', 'X', 'O')
('X', 'X', 'O', 'X', 'X', 'X', 'X', 'X')
('X', 'X', 'X', 'O', 'O', 'O', 'O', 'O')
('X', 'X', 'X', 'O', 'O', 'O', 'O', 'X')
('X', 'X', 'X', 'O', 'O', 'O', 'X', 'O')
('X', 'X', 'X', 'O', 'O', 'O', 'X', 'X')
('X', 'X', 'X', 'O', 'O', 'X', 'O', 'O')
('X', 'X', 'X', 'O', 'O', 'X', 'O', 'X')
('X', 'X', 'X', 'O', 'O', 'X', 'X', 'O')
('X', 'X', 'X', 'O', 'O', 'X', 'X', 'X')
('X', 'X', 'X', 'O', 'X', 'O', 'O', 'O')
('X', 'X', 'X', 'O', 'X', 'O', 'O', 'X')
('X', 'X', 'X', 'O', 'X', 'O', 'X', 'O')
('X', 'X', 'X', 'O', 'X', 'O', 'X', 'X')
('X', 'X', 'X', 'O', 'X', 'X', 'O', 'O')
('X', 'X', 'X', 'O', 'X', 'X', 'O', 'X')
('X', 'X', 'X', 'O', 'X', 'X', 'X', 'O')
('X', 'X', 'X', 'O', 'X', 'X', 'X', 'X')
('X', 'X', 'X', 'X', 'O', 'O', 'O', 'O')
('X', 'X', 'X', 'X', 'O', 'O', 'O', 'X')
('X', 'X', 'X', 'X', 'O', 'O', 'X', 'O')
('X', 'X', 'X', 'X', 'O', 'O', 'X', 'X')
('X', 'X', 'X', 'X', 'O', 'X', 'O', 'O')
('X', 'X', 'X', 'X', 'O', 'X', 'O', 'X')
('X', 'X', 'X', 'X', 'O', 'X', 'X', 'O')
('X', 'X', 'X', 'X', 'O', 'X', 'X', 'X')
('X', 'X', 'X', 'X', 'X', 'O', 'O', 'O')
('X', 'X', 'X', 'X', 'X', 'O', 'O', 'X')
('X', 'X', 'X', 'X', 'X', 'O', 'X', 'O')
('X', 'X', 'X', 'X', 'X', 'O', 'X', 'X')
('X', 'X', 'X', 'X', 'X', 'X', 'O', 'O')
('X', 'X', 'X', 'X', 'X', 'X', 'O', 'X')
('X', 'X', 'X', 'X', 'X', 'X', 'X', 'O')
('X', 'X', 'X', 'X', 'X', 'X', 'X', 'X')

【讨论】:

  • 谢谢!我一定会试试的。
  • 我还有一个问题:如果我想快速制作 ["X", "O","O", "O","O" 的所有排列, "O","O", "O"],我怎么找到它?
  • @BobRobert:因为只有一个“X”,所以我会使用["O"*i + "X" + "O"*(8-i) for i in range(8)](或者与元组/列表等效,如果这很重要的话)。
  • 我刚刚意识到这比我想象的要简单。我实际上只需要检查它是否是其中之一,我可以使用 .count() 函数来检查它。无论如何,谢谢!
【解决方案2】:

您应该改用itertools.product(...):

from itertools import product

Res=list(product(["o", "x"], repeat=8))

【讨论】:

  • 我还有一个问题:如果我想快速制作 ["X", "O","O", "O","O" 的所有排列, "O","O", "O"],我怎么找到它?
猜你喜欢
  • 1970-01-01
  • 2018-11-12
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2016-10-22
  • 1970-01-01
相关资源
最近更新 更多