如果满足条件,则在 Python 中配对名称

Pairing names in Python if condition is met

我负责创建一个快速程序,让人们成对参加我正在帮助举办的体育比赛。我需要确保不会将 2 个特定名称配对在一起。

我已经能够创建一些东西来获取名称列表,将它们打乱顺序,然后生成另一个包含配对的 txt 文件。

这非常有效,但部分要求是防止两个名称配对在一起。好久没用Python了,忘了能不能用了。

from random import shuffle

with open('names.txt', 'r') as f:
    names = [name.strip() for name in f]

shuffle(names)

pairs = zip(names[::2], names[1::2])

with open('output.txt', 'w') as f:
    f.write('Doubles Pairings 2019 are: \n \n')
    for pair in pairs:
        f.write('%s is paired with %s\n' % pair)

预期结果如下:

Doubles pairings 2019 are: 

Amy is paired with Jenny
Emily is paired with Lydia
Andrew is paired with Peter
Patrick is paired with Louise
Donald is paired with Sean
Sarah is paired with George
Jade is paired with Julia
Katie is paired with Joe

结果显然是随机的,但最好确保 Amy 永远不会与 Sean 配对。

一个选项是包含一个支票,if ('Amy','Sean') in pairs: 并重新洗牌,作为基本方法

根据建议,不要忘记检查名称的配对方向,即如果每个名称都来自列表一或列表二,则可能是

('Amy','Sean')('Sean','Amy')

你可以安排你的名单,让不应该配对的两个名字都在一半,而只将其余的洗牌:

from random import shuffle

no_pair = ['Amy', 'Sean']
for n in no_pair:
    names.remove(n)
shuffle(names)
names = no_pair + names

然后简单地将列表分成两半进行配对:

N = len(names)//2
lhs = names[:N]
rhs = names[N:]

#print(*zip(lhs, rhs), sep='\n')

#('Amy', 'Andrew')
#('Sean', 'Jade')                                            
#('Donald', 'Joe')                                           
#('Emily', 'George')                                         
#('Jenny', 'Peter')                                          
#('Julia', 'Patrick')                                        
#('Louise', 'Lydia')                                         
#('Katie', 'Sarah')