Во-первых, давайте обобщим это на любое количество групп
GroupA = [('Joe', 1), ('Kate', 2), ('Jeff', 1)]
GroupB = [('Sam', 1), ('Jim', 2), ('Stephanie', 2)]
GroupC = [('Adam', 2), ('David', 1), ('Liz', 1), ('Michael', 2)]
groups = [GroupA, GroupB, GroupC]
Затем мы будем перебирать группы и повторять элементы по мере необходимости (с приоритетом 1). Мы также уберем рейтинг каждого элемента в списке.
max_len = max(map(len, groups))
names = []
for group in groups:
subgroup = list(group)
if any(rank == 1 for _, rank in group):
subgroup = list(filter(lambda x:x[1] == 1, group))
group += subgroup * (max_len - len(group))
names.append([name for name, _ in group])
Теперь имена содержат списки имен, имена которых повторяются как минимум столько раз, сколько необходимо для соответствия самой длинной группе (вероятно, больше, которое zip
будет обрезать).
Мы будем знать эти списки вместе и получим наши команды.
teams = list(zip(*names))
Результат:
>>> print("\n".join(map(str, teams)))
('Joe', 'Sam', 'Adam')
('Kate', 'Jim', 'David')
('Jeff', 'Stephanie', 'Liz')
('Joe', 'Sam', 'Michael')