Разбить список на пары python
Не могу разбить список [0,1,2,3,4,5,6,7,8,9,10,11] на все возможные пары.
Где [0,1,2], [3,4,5], [6,7,8], [9,10,11] - Представляют разные группы. То есть всего групп у нас 4.
Нужно разбить так, чтобы в каждой паре были представители из разных групп. А так же если например существует пара между первой и второй группой, то больше пар между этими группами быть не может.
Получилось разбить только на все возможные пары. Без этих условий
def all_pairs(lst):
if len(lst) < 2:
yield []
return
if len(lst) % 2 == 1:
for i in range(len(lst)):
for result in all_pairs(lst[:i] + lst[i+1:]):
yield result
else:
a = lst[0]
for i in range(1,len(lst)):
pair = (a,lst[i])
for rest in all_pairs(lst[1:i]+lst[i+1:]):
yield [pair] + rest
Ответы (1 шт):
Автор решения: eri
→ Ссылка
lst = [0,1,2,3,4,5,6,7,8,9,10,11]
Разобьём на группы
n = len(lst) // 4
grps = (lst[i:i + n] for i in range(0, len(lst), n))
# list(grps) == [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]
Комбинируем сами группы, а не список
from itertools import combinations
cmb = combinations(grps, 2)
# list(cmb) == [([0, 1, 2], [3, 4, 5]), ([0, 1, 2], [6, 7, 8]),
# ([0, 1, 2], [9, 10, 11]), ([3, 4, 5], [6, 7, 8]), ([3, 4, 5],
# [9, 10, 11]), ([6, 7, 8], [9, 10, 11])]
Дергаем из каждой пары групп по элементу.
result = []
for a,b in cmb:
result.append((a.pop(),b.pop()))
# result == [(2, 5), (1, 8), (0, 11), (4, 7), (3, 10), (6, 9)]
На генераторах:
from itertools import combinations
def all_pairs(lst):
n = len(lst) // 4
grps = (lst[i:i + n] for i in range(0, len(lst), n))
cmb = combinations(grps, 2)
for a,b in cmb:
yield ((a.pop(),b.pop()))