есть серия триплетов:
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12],[13, 14, 15]]
(может быть длиннее).Все они уникальны.
Q: Каков эффективный способ генерации всех возможных комбинаций этих триплетов, чтобы ни один из предметов, которые встречались ранее, не «встречался» снова?
Так, например, в этой последовательности ни один из триплетов не содержит элементов, которые встречались ранее:
[[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]]