python - 生成所有唯一的三元组

标签 python random combinatorics

有一系列三元组:

[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12],[13, 14, 15]]

(可以比这更长)。它们都是独一无二的。

问:生成这些三元组的所有可能组合的有效方法是什么,这样以前见过的项目都不会再次“相遇”?

因此,例如在此序列中,没有一个三元组包含之前遇到的任何项目:

[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12],[13, 14, 15]]
[[1, 5, 9], [4, 8, 12], [7, 11, 15], [10, 14, 3],[2, 6, 13]]
[[1, 4, 7], [5, 8, 11], [9, 12, 15], [10, 13, 2],[14, 3, 6]]

但是这个不行:

[[1, 5, 9], [4, 6, 12], [7, 11, 15], [10, 14, 3],[2, 8, 13]]

因为第二个三元组中的 46 之前已经在同一个三元组中,特别是在 [4, 5, 6] 中第一条记录

我认为可以通过使用random.sample(l, 3)从初始序列中挑选随机三元组来完成,然后检查这个三元组以前是否没有被使用过,但它看起来效率很低我想知道是否有更好的方法。

更新:::

我意识到发布一个丑陋且低效的代码仍然有效是有意义的,只是为了说明我在说什么:

import random
import itertools

z = list(range(1, 10))
group_size = 3
superset = list()



def check_not_met(x):
    for i in superset:
        if set(x).issubset(set(i)):
            return False
    return True


def check_not_anyone_met(x):
    for i in itertools.combinations(x, 2):
        if not check_not_met(i):
            return False
    return True


subsession_matrices = list()


def generating_subsession(seq):
    subglobal = list()
    while seq:
        x = a[-group_size:]
        if check_not_anyone_met(x):
            subglobal.append(x)
        else:
            return False
        del seq[-group_size:]
    return subglobal

for j in range(10000):
    a = z.copy()
    random.shuffle(a)
    subsession_matrix = generating_subsession(a)
    if not subsession_matrix:
        continue
    else:
        subsession_matrices.append(subsession_matrix)
        superset.extend(subsession_matrix)

print(subsession_matrices)

输出是:

[[3, 7, 1], [8, 2, 4], [6, 5, 9]]
[[8, 1, 9], [3, 5, 2], [7, 6, 4]]
[[3, 8, 6], [1, 4, 5], [7, 2, 9]]
[[8, 5, 7], [1, 2, 6], [3, 9, 4]]

最佳答案

好吧,这最初是一条评论,但它太大了,没有用。

首先,根据您的定义,不存在唯一的组合。让我解释一下:

因为,您不想重复已经出现在三元组中的任何 2 个数字(它们出现的顺序很重要)并更改组合。

举个例子来说明这一点:

假设你开始于:

[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]]

一个可能的序列(与您的不同)可能是:

[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]]
[[1, 5, 10], [4, 8, 12], [7, 11, 15], [9, 14, 3],[ 2, 6, 13]]

(只需在第二个组合中将 9 替换为 10)。但这使得 15 在同一个三元组中再次无法使用,因此在该序列中您的第二个组合

[[1, 5, 9], [4, 8, 12], [7, 11, 15], [10, 14, 3],[2, 6, 13]]

无法出现在我的序列中。

那么,你如何定义独特呢?我认为你的定义有问题。我什至不确定顺序是否会对序列的长度产生任何影响。

check if this triplet has not been used before

如果您对唯一的序列不感兴趣,而是希望将限制应用于序列并获得尽可能多的组合,那么上述方法将不起作用。您应该检查三元组中是否包含 2 个数字,而不是检查三元组之前是否出现过。您的标准将无法识别该组合

[[1, 5, 9], [4, 7, 13], [8, 11, 15], [10, 14, 3], [2, 6, 12]]

虽然所有三胞胎以前都没有出现过,但这是 Not Acceptable 。

希望这有帮助。无论如何,如果我误解了某些内容,请进行编辑。

关于python - 生成所有唯一的三元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52513365/

相关文章:

php - 寻找无碰撞随机数的有效方法

algorithm - 给定一个字符串 s 和一个整数 i,创建 s 的所有连续子字符串,排序并连接它们,并有效地找到索引 i 处的字母

python - Django & Redis : How do I properly use connection pooling?

python - 从列表变量到 Pandas 中的列

algorithm - 无放回和负权重的加权抽样

java - 使用多个求和查找有序集的组合数

algorithm - 修改二进制序列

Python 正确的全局用法

python - 带有 MySQL 的 pandas 可以支持文本索引吗?

java - 在数组java中搜索一个数字