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

时间:2019-02-11 22:11:49

标签: python python-3.7

我负责创建一个快速计划,将成对的人参加我正在协助举办的体育比赛。我需要确保不会将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配对。

2 个答案:

答案 0 :(得分:0)

一种选择是包括支票if ('Amy','Sean') in pairs:,并将其重新洗牌,作为基本方法

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

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

答案 1 :(得分:0)

您可以安排您的列表,以使两个不应该配对的名字都成一半,而其余的则只洗牌:

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')