'Combinations divided into rows with no repetition of elements

I'm working with lists in Python.

I have a list of colleagues which is colleagues=['Jack', 'Jessica' 'John', 'Mark', 'Mary', 'Paul']

  1. I want to calculate all possible couples (i.e. combination without repetition, order does not matter). That means this result:

couples=[['Jack', 'Jessica'], ['Jack', 'John'], ['Jack', 'Mark'], ['Jack', 'Mary'], ['Jessica', 'John'], ['Jessica', 'Mark'], ['Jessica', 'Mary'], ['John', 'Mark'], ['John', 'Mary'], ['Mark', 'Mary'], ['Jack', 'Paul'], ['Jessica','Paul'], ['John','Paul'], ['Mark','Paul'], ['Mary','Paul']]

  1. Then, I want the couples to be split into n-1 dates where they would meet each other (therefore, every person appears only once every day) That is sort of:
Day Meeting_1 Meeting_2 Meeting_3
0 'Jack', 'Jessica' 'John', 'Mark' 'Mary','Paul'
1 'Jack', 'John' 'Mark', 'Mary' 'Jessica','Paul'
2 'Jack', 'Mark' 'John','Paul' 'Jessica', 'Mary'
3 'Jack', 'Mary' 'Jessica', 'John' 'Mark','Paul'
4 'Jack', 'Paul' 'Jessica', 'Mark' 'John', 'Mary'

How can I do it? Also, I need a code that works for whatever n and k in the combination.

Thanks in advance and please, ask if there's a missing input you need. I will provide you with everything.

Cheers



Solution 1:[1]

The formula should be n!/((n-k)!*k!). So applied in python it should be something like this.

def couples(lst):
    l = []
    for i in range(len(lst)):
        for j in range(i+1,len(lst)):
            l.append([lst[i],lst[j]])
    return l

Solution 2:[2]

You can try a recursive couple generator:

def couples(l):
    if not l:
        yield []
    for a in ((l[0],x) for x in l[1:]):
        for b in couples([x for x in l if x not in a]):
            yield [a]+b
            
pd.DataFrame(couples(colleagues))

Output:

                  0                1             2
0   (Jack, Jessica)     (John, Mark)  (Mary, Paul)
1   (Jack, Jessica)     (John, Mary)  (Mark, Paul)
2   (Jack, Jessica)     (John, Paul)  (Mark, Mary)
3      (Jack, John)  (Jessica, Mark)  (Mary, Paul)
4      (Jack, John)  (Jessica, Mary)  (Mark, Paul)
5      (Jack, John)  (Jessica, Paul)  (Mark, Mary)
6      (Jack, Mark)  (Jessica, John)  (Mary, Paul)
7      (Jack, Mark)  (Jessica, Mary)  (John, Paul)
8      (Jack, Mark)  (Jessica, Paul)  (John, Mary)
9      (Jack, Mary)  (Jessica, John)  (Mark, Paul)
10     (Jack, Mary)  (Jessica, Mark)  (John, Paul)
11     (Jack, Mary)  (Jessica, Paul)  (John, Mark)
12     (Jack, Paul)  (Jessica, John)  (Mark, Mary)
13     (Jack, Paul)  (Jessica, Mark)  (John, Mary)
14     (Jack, Paul)  (Jessica, Mary)  (John, Mark)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 federicknellus
Solution 2 mozway