有一系列三元组:
[[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]]
因为第二个三元组中的 4
和 6
之前已经在同一个三元组中,特别是在 [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
)。但这使得 1
和 5
在同一个三元组中再次无法使用,因此在该序列中您的第二个组合
[[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/