把矩阵的元素按4个一组组合起来而不重复

2024-05-21 08:08:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我是这个社区的新成员,也是Python的新用户。你知道吗

我面临着一个小问题,无论是在概念和编码水平。具体如下:

我有11组8个相同的元素(在现实生活中,它们是2个棉垫,每个4块,总共8块,乘以11个捐赠者——这是一个体味收集研究),即:

A A A A A A A A A A A A B B B B B B B B B B B B B B B C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C ... M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M

我现在要通过组合4个不同的供体来形成一个超供体垫,例如ABCD,ABCE,CDEF等。。。由4个元素组成的新组不应包含来自同一供体的碎片(例如,不允许使用AABC或ABDD),当然,如果使用了一个碎片,那么它就不能用来形成另一个超供体垫。 我想编写一些代码,让团队自动形成,而不必撞到我的头手动做,冒着失去计数的风险。你知道吗

这是没有重复的组合吗? 我在想这样做:创建一个像上面那样的矩阵,创建20个(我需要的超供体垫的数量)4元素空组(列表?)然后是一个循环,在这个循环中,我告诉你随机选取矩阵的Cij元素,并将它移到空列表中,然后转到下一个要选取的元素,但要确保它是不同的类型,并且是前一个组中没有选取的片段(例如,如果一个组有元素C43,那么同一个元素不应该在另一个组中使用)。这样做,直到4元素组已满,然后移动到下一个4元素组

我请求一些帮助,因为我几乎没有时间做这件事,否则我会试图通过犯大量的错误来学习。 有什么建议吗?你知道吗

编辑:一个表的例子,其中有已经创建的4个元素组和用于所用不同元素的第八部分的数量(当然,其中一些是预先准备好的)

supra-donor pads

提前感谢各位愿意提供的真知灼见!你知道吗


Tags: 用户概念元素编码列表数量水平成员
1条回答
网友
1楼 · 发布于 2024-05-21 08:08:31

这里有一个解决方案,它生成所有可能的捐赠者组合,然后对它们进行洗牌,并在每次迭代中选择一个新的捐赠者。如果选取的一个无效,因为选取的捐赠者的所有样本都已用尽,则丢弃该组合并选择一个新的。你知道吗

import itertools
import random

def comb_generator(bases, per_base, sought):
    combs = list(itertools.combinations(bases, 4))
    random.shuffle(combs)

    avail = {}
    for base in bases:
        avail[base] = per_base

    comb_wanted = sought > 0 # Ensure picking at least one new comb
    while comb_wanted:
        comb = combs.pop()
        comb_wanted = False

        for base in comb:
            comb_wanted = avail[base] <= 0
            if comb_wanted:
                break

        if not comb_wanted:
            for base in comb:
                avail[base] -= 1
            yield comb
            sought -= 1
            comb_wanted = sought > 0

bases = 'ABCDEFGHIJKLM'
per_base = 8
sought = 20

comb_gens = comb_generator(bases, per_base, sought)

for i, comb in enumerate(comb_gens):
    print('{:2}: {}'.format(i, comb))

可以看出,我将解决方案实现为一个生成器,因为我发现这在以后处理条目时非常有用。你知道吗

注意:目前的解决方案并不关心每个捐赠者的样本数量是否相等。可以通过增加一项要求来做到这一点,即要求不同的捐助者不能有太大的差别。但这会增加复杂性,即丢弃的组合会被重新插入“组”中的稍后位置。你知道吗

相关问题 更多 >