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

问题描述 投票:1回答: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配对会很好。

python python-3.7
2个回答
0
投票

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

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

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


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')                                                  
© www.soinside.com 2019 - 2024. All rights reserved.