Есть серия триплетов: < /p>
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12],[13, 14, 15]]
< /code>
(может быть длиннее этого). Все они уникальны. < /P>
Q: < /strong> Каков эффективный способ генерирования всех возможных комбинаций этих триплетов, так что ни один из элементов, которые не встречались ранее, «встретиться» снова?[[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]]
< /code>
Но этот не будет работать: < /p>
[[1, 5, 9], [4, 6, 12], [7, 11, 15], [10, 14, 3],[2, 8, 13]]
Потому что 4 и 6 из второй триплета были в одной и той же триплете, в частности, в [4, 5, 6] из первой записи
Я думаю, что это можно сделать, чтобы выбрать случайный триплет с начальной последовательностью. Раньше, но это выглядит довольно неэффективно, и мне интересно, есть ли более приятный способ.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)
< /code>
А вывод: < /p>
[[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]]
Подробнее здесь: https://stackoverflow.com/questions/525 ... e-triplets
Генерировать все уникальные триплеты ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение