python - 使用数组和组合模式查找组合

标签 python combinations permutation

我有这样的数组,每个图案指定一个组合形状,每个数字代表组合的大小。

  • 模式 0:[1, 1, 1, 1]
  • 模式 1:[2, 1, 1]
  • 模式 2:[3, 1]
  • 模式 3:[4]
  • ...

我还有一个如下所示的字符值列表。 len(chars) 等于上层数组值的总和。

chars = ['A', 'B', 'C', 'D']

我想找到遵循给定模式的所有字符组合。例如,对于模式1,4C2 * 2C1 * 1C1 是组合的数量。

[['A', 'B'], ['C'], ['D']]
[['A', 'B'], ['D'], ['C']]
[['A', 'C'], ['B'], ['D']]
[['A', 'C'], ['D'], ['B']]
[['A', 'D'], ['B'], ['C']]
[['A', 'D'], ['C'], ['B']]
...

但我不知道如何创建这样的组合数组。我当然知道 python 中有很多组合的有用函数。但是我不知道如何使用它们来创建组合的组合数组。

已编辑

很抱歉我的解释令人困惑。我展示了一个简单的例子。

  • 模式 0:[1, 1]
  • 模式 1:[2]
  • chars = ['A', 'B']

然后,结果应该如下所示。所以第一维应该是排列,第二维应该是组合。

  • pat0: [['A'], ['B']]
  • pat0: [['B'], ['A']]
  • pat1: [['A', 'B']] # 注意:[['B', 'A']] 在我的问题中是一样的

最佳答案

您可以使用递归函数,它采用模式中的第一个数字,并从剩余项目中生成该长度的所有组合。然后递归剩余的模式和项目以及生成的前缀。一旦您使用了模式中的所有数字,只需 yield 前缀一直到调用者:

from itertools import combinations

pattern = [2, 1, 1]
chars = ['A', 'B', 'C', 'D']

def patterns(shape, items, prefix=None):
    if not shape:
        yield prefix
        return

    prefix = prefix or []
    for comb in combinations(items, shape[0]):
        child_items = items[:]
        for char in comb:
            child_items.remove(char)
        yield from patterns(shape[1:], child_items, prefix + [comb])

for pat in patterns(pattern, chars):
    print(pat)

输出:

[('A', 'B'), ('C',), ('D',)]
[('A', 'B'), ('D',), ('C',)]
[('A', 'C'), ('B',), ('D',)]
[('A', 'C'), ('D',), ('B',)]
[('A', 'D'), ('B',), ('C',)]
[('A', 'D'), ('C',), ('B',)]
[('B', 'C'), ('A',), ('D',)]
[('B', 'C'), ('D',), ('A',)]
[('B', 'D'), ('A',), ('C',)]
[('B', 'D'), ('C',), ('A',)]
[('C', 'D'), ('A',), ('B',)]
[('C', 'D'), ('B',), ('A',)]

请注意,上面仅适用于 Python 3,因为它使用 yield from

关于python - 使用数组和组合模式查找组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40080263/

相关文章:

c# - 随机排列元素,使得任何元素都不应出现在其原始索引处

java - Java ArrayList 中元素的 k 排列

r - 如何将函数应用于数据框中的所有行组合?

string - 生成所有字符串组合的算法

python - 尝试通过源代码开始跟踪 Python 特性和行为

Python 3.4 无法识别包

javascript - 将数组拆分为固定的 n 个具有动态大小的 block

algorithm - 使用动态规划计算排列数

python - SciPy 中的差分进化

python - 显示运行 python 脚本的进度条