комбинация intertools 2 против 2 в списке python - PullRequest
0 голосов
/ 02 апреля 2020

Мне нужно создать команду из 2х2 человек

Вот мой список игроков

L=["P1","P2","P3","P4"]

import itertools

Я знаю, как создать все 1v1 или 1v1v1, возможные с помощью

>>> L=["P1","P2","P3","P4"]
>>> for p in itertools.combinations(L,2) :
...     print(p)
... 
('P1', 'P2')
('P1', 'P3')
('P1', 'P4')
('P2', 'P3')
('P2', 'P4')
('P3', 'P4')

или

>>> for p in itertools.combinations(L,3) :
...     print(p)
... 
('P1', 'P2', 'P3')
('P1', 'P2', 'P4')
('P1', 'P3', 'P4')
('P2', 'P3', 'P4')

но как распечатать все 2V2 возможно?

1 Ответ

2 голосов
/ 02 апреля 2020

Вы можете сделать следующее, довольно наивно, но эффективно:

for p in itertools.combinations(L,2) :
    o = tuple(x for x in L if x not in p)
    print(p, o)

('P1', 'P2') ('P3', 'P4')
('P1', 'P3') ('P2', 'P4')
('P1', 'P4') ('P2', 'P3')
('P2', 'P3') ('P1', 'P4')
('P2', 'P4') ('P1', 'P3')
('P3', 'P4') ('P1', 'P2')

Для большего количества игроков вы можете сделать:

L = ["P1", "P2", "P3", "P4", "P5"]
for p in itertools.combinations(L,2) :
    o = [x for x in L if x not in p]
    for x in itertools.combinations(o, 2):
        print(p, x)

Что бы вы дали двойной круговой прием; ) Для одного кругового приема:

for p in itertools.combinations(L,2) :
    o = [x for x in L if x > p[0] and x != p[1]]
    for x in itertools.combinations(o, 2):
        print(p, x)

('P1', 'P2') ('P3', 'P4')
('P1', 'P2') ('P3', 'P5')
('P1', 'P2') ('P4', 'P5')
('P1', 'P3') ('P2', 'P4')
('P1', 'P3') ('P2', 'P5')
('P1', 'P3') ('P4', 'P5')
('P1', 'P4') ('P2', 'P3')
('P1', 'P4') ('P2', 'P5')
('P1', 'P4') ('P3', 'P5')
('P1', 'P5') ('P2', 'P3')
('P1', 'P5') ('P2', 'P4')
('P1', 'P5') ('P3', 'P4')
('P2', 'P3') ('P4', 'P5')
('P2', 'P4') ('P3', 'P5')
('P2', 'P5') ('P3', 'P4')
...