Como aprendi a amar os itertools python

Imagine que você tem uma lista de IDs de usuário:

user_ids = [1, 2, 3]

e você precisa verificar se esses usuários são amigos e, se não, torná-los amigos.

Existem 9 combinações diferentes para verificar:

combinations = [
(1, 1)
(1, 2)
(1, 3)
(2, 1)
(2, 2)
(2, 3)
(3, 1)
(3, 2)
(3, 3)
]

Podemos excluir a maioria das combinações porque o usuário não pode ser amigo de si mesmo e podemos supor que se o usuário A é amigo do usuário B, então também o usuário B é amigo do usuário A. Portanto, ficamos com estas combinações para verificar:

combinations = [
(1, 2)
(1, 3)
(2, 3)
]

A solução mais simples que vem à mente é escrever forloops aninhados :

for a in user_ids:
for b in user_ids:
if a == b:
# user cannot be friends with oneself
continue

if a > b:
# exclude duplicate/reverse combinations
continue

if not friends(a, b):
create_friendship
(a, b)

Vamos tentar simplificar esse código usando a biblioteca python itertools:

import itertools

for a, b in itertools.combinations(user_ids, 2):
if not friends(a, b):
create_friendship
(a, b)

o /