我正在试图找到一种方法,从K个字母的列表中生成所有可能的长度为N的"模式".我看过类似的问题,但他们似乎都在问组合、排列等,这正是我想要的.

例如,let K = 3N = 2.也就是说,我想要所有可以用字母[A,B,C]构成的两个字母的"图案".AA就是这样一种模式.AB是另一个.只有这两个.BB和CC与AA相同,只是"一个字母,然后是同一个字母."类似地,BA、BC、AC等与AB相同,只是"一个字母,然后是另一个字母."所以对于这个简单的例子,只有两种模式,事实上这说明了为什么K必须小于或等于N(添加额外的字母来 Select 不会改变任何东西).

如果相反,K=3,N=3,那么五种可能的模式将是AAA、AAB、ABA、ABB和ABC.每三个字母的其他排列都有一个与这五个字母中的一个相同的模式.

如果K=2,N=3,则只有四种可能的模式:AAA、AAB、ABA、ABB.(ABC不再是有效的 Select ,因为我只有两个字母可供 Select .)

当然,这些示例手工操作很简单——我正在try 创建代码,为N和K的较大值生成所有可能的模式.这可能更像是一个纯粹的数学问题,但最终我需要一个Python函数来生成这些,所以我想我首先try 一下,看看是否有人知道或能够想出一种有效的方法来实现这一点.

推荐答案

其中一条来自@JacobRR的 comments 非常接近我们的需要.每个"模式"实际上对应于将集合{1,2,…,N}划分为K个子集.每个子集(甚至为空!)对应字母l\u k应放置的位置(l\u 1=A,l\u 2=B等).这里有一个演示.

例如,在K=3,N=3的情况下,分区将是

{1,2,3}, ∅, ∅
{1}, {2, 3}, ∅
{2}, {1, 3}, ∅
{3}, {1, 2}, ∅
{1}, {2}, {3}

对于K=2,N=3,它是

{1,2,3}, ∅
{1}, {2, 3}
{2}, {1, 3}
{3}, {1, 2}

与给定示例完全对应.

这个问题也是相关的.

https://codereview.stackexchange.com/questions/1526/finding-all-k-subset-partitions

我还编写了自己的天真实现.

import copy

N = 3
K = 2

iter = min(N, K)

def partitions(S, K):

    if K == 1:
        return [[S]]
    if len(S) == 0:
        return [[]]
    
    result = []
    S_new = copy.copy(S)
    first = S_new.pop(0)
    
    if (K-1 <= len(S_new)):
        p1 = partitions(S_new, K-1)
        for p in p1:
            p.append([first])
            result.append(p)
    if (K <= len(S_new)):
        p2 = partitions(S_new, K)

        for p in p2:
            for idx in range(len(p)):
                p_new = copy.deepcopy(p)
                p_new[idx].append(first)
                result.append(p_new)
                
        
    return result

for idx in range(1, iter+1):
    print(partitions([i for i in range(0, N)], idx))    

Python相关问答推荐

如何将多进程池声明为变量并将其导入到另一个Python文件

为什么NumPy的向量化计算在将向量存储为类属性时较慢?'

为什么Django管理页面和我的页面的其他CSS文件和图片都找不到?'

Polars将相同的自定义函数应用于组中的多个列,

在Python中使用yaml渲染(多行字符串)

如果包含特定值,则筛选Groupby

Tensorflow tokenizer问题.num_words到底做了什么?

如何在GEKKO中使用复共轭物

在极点中读取、扫描和接收有什么不同?

如何将相同组的值添加到嵌套的Pandas Maprame的倒数第二个索引级别

如何在Gekko中处理跨矢量优化

用由数据帧的相应元素形成的列表的函数来替换列的行中的值

在一个数据帧中,我如何才能发现每个行号是否出现在一列列表中?

VSCode Pylance假阳性(?)对ImportError的react

将数据从一个单元格保存到Jupyter笔记本中的下一个单元格

从`end_date`回溯,如何计算以极为单位的滚动统计量?

使用pytest测试是否缺少导入

如何判断特定的OPC UA node 是否已经存在Asyncua?

在伪子进程中模拟标准输出.打开

为什么Python多处理.Process()传递队列参数并且读取比函数传递队列参数和读取更快?