Beispiel: unterschiedliche Paare bilden

Beispiel: unterschiedliche Paare bilden#

Problem: Wir haben n Menschen, z.B n = 100. Wir wollen m mal je 2 Menschen ins Gespräch bringen, aber nie das gleiche Paar zwei mal.

Außerdem pfelgen wir eine Liste blacklist, in der schon alle Paare der Vergangenheit gespeichert sind (oder die sich bekanntemaßen nicht gut vertragen). Diese Paare dürfen auch nicht mehr in die Grundgesamtheit der möglichen Paare mit aufgenommen werden.

n = 5 # Anzahl Menschen
m = 3 # gewünschte Anzahl Paare, mit m <= n//2
blacklist = [ (0,1), (1,2), (2,3) ] # Testbeispiel
moegliche_paare = []
for i in range(0,n):
    for j in range(i+1,n):
        if (i,j) not in blacklist:
            moegliche_paare.append( (i,j) )
print(moegliche_paare)
[(0, 2), (0, 3), (0, 4), (1, 3), (1, 4), (2, 4), (3, 4)]
# Oder mit List Comprehension
moegliche_paare = [ (i,j) for i in range(0,n) for j in range(i+1,n) if (i,j) not in blacklist ]
print(moegliche_paare)
[(0, 2), (0, 3), (0, 4), (1, 3), (1, 4), (2, 4), (3, 4)]

Wie viele Elemente hat die Liste moegliche_paare?

len(moegliche_paare), len(blacklist)
(7, 3)

Wir wählen aus moegliche_paare einige Paare aus. Dazu lassen wir uns jeweils eine neue Zufallszahl p aus range(0, len(moegliche_paare)) geben, poppen das Element moegliche_paare[p] und fügen dieses Paar in unsere Liste der gezogenen Paare ein.

import random
# https://python.readthedocs.io/en/stable/library/random.html#functions-for-integers
# Beispiel:
random.randrange(0, n)
1

Die folgende Schleife kann man mehrfach ausführen:

m = 3
neu_gezogene_paare = []
for i in range(m): # wiederhole m mal
    p = random.randrange(0, len(moegliche_paare))
    neu_gezogene_paare.append( moegliche_paare.pop(p) ) # https://docs.python.org/3/tutorial/datastructures.html

blacklist.extend(neu_gezogene_paare)
print(f"{neu_gezogene_paare=}\nneue {blacklist=}\n{len(moegliche_paare)=}")
neu_gezogene_paare=[(1, 3), (3, 4), (0, 4)]
neue blacklist=[(0, 1), (1, 2), (2, 3), (1, 3), (3, 4), (0, 4)]
len(moegliche_paare)=4
print(f"{neu_gezogene_paare=}\nneue {blacklist=}\n{len(moegliche_paare)=}")
neu_gezogene_paare=[(1, 3), (3, 4), (0, 4)]
neue blacklist=[(0, 1), (1, 2), (2, 3), (1, 3), (3, 4), (0, 4)]
len(moegliche_paare)=4