条件为m时Python中的名称配对

2024-04-20 09:23:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我负责创建一个快速的计划,让人们结对参加我正在帮助主办的体育比赛。我需要确保两个特定的名字不会配对在一起。你知道吗

我已经能够创建的东西,将采取名单上的名字,洗牌他们,然后生成另一个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

结果显然是随机的,但最好能确保艾米永远不能和肖恩配对。你知道吗


Tags: nameintxtfornamesisaswith
2条回答

您可以排列您的列表,使不应配对的两个名称都在一个一半中,而只洗牌其余的名称:

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

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

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

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

相关问题 更多 >