我正在尝试编写一个脚本,将男性和女性配对以进行秘密的圣诞老人类型活动。所以我有2个男孩和女孩的名单,并希望进行2路匹配,但目前我似乎只能弄清楚如何进行1路匹配。
此外我遇到的问题是......在下面的例子中,如果Kedrick得到Annabel,那么Annabel就无法得到Kedrick。 Kedrick必须从列表中找到其他人。
我目前的实施如下,如何扩展其功能以满足上述要求?
boys = ['Kedrick','Jonathan','Tim','Philip','John','Quincy'];
girls = ['Annabel','Janet','Jocelyn','Pamela','Priscilla','Viviana'];
matches = []
for i in boys:
rand - randint(0, len(girls-1)
fullname = "{} matched with {}".format(i, girls(rand)
del girls(rand)
matches.append(fullname)
print matches
答案 0 :(得分:2)
这可能是用更少的循环和更少的代码来完成的,但这是我的解决方案!创建了2个dict来存储名称和目标(dict可以组合或同时完成以减少内存问题,但是使用这个大小的程序我认为你不会遇到这个问题!
boys = ['Kedrick','Jonathan','Tim','Philip','John','Quincy'];
girls = ['Annabel','Janet','Jocelyn','Pamela','Priscilla','Viviana'];
matchesBoys = {i:{'to':''} for i in boys}
matchesGirls = {i:{'to':''} for i in girls}
for name in boys:
giveTo = girls[random.randint(0, len(girls)-1)]
girls.remove(giveTo)
matchesBoys[name]['to']=giveTo
for name in matchesGirls:
giveTo = boys[random.randint(0, len(boys)-1)]
boys.remove(giveTo)
matchesGirls[name]['to']=giveTo
del boys, girls
for i in matchesBoys:
print "%s matched with %s"%(i, matchesBoys[i]['to'])
for i in matchesGirls:
print '%s matched with %s'%(i, matchesGirls[i]['to'])
答案 1 :(得分:1)
将两个列表混洗并将它们放入一个环中,其他所有元素都来自第一个或第二个列表。每个人都给他们右边的礼物送礼物。类似于这样的列表:
[Girl, Boy, Girl, Boy, ..., Boy]
最后一个元素为第一个元素提供礼物。
它假设两个列表具有相同数量的元素并且总共至少有四个元素,否则问题无法解决。
这提供了一个满足您的约束的解决方案。该问题的一般解决方案是在集合之间找到有向bipartite graph,其中每个顶点具有恰好两个边,一个传入和一个传出。也许这个问题的解决方案也总能形成一个环?
答案 2 :(得分:0)
这是一个创建一个带有替代男孩和女孩的圆圈的实现。有关这个想法的解释,请参阅@Emil Vickstom的答案。
from random import shuffle
boys = ['Kedrick','Jonathan','Tim','Philip','John','Quincy'];
girls = ['Annabel','Janet','Jocelyn','Pamela','Priscilla','Viviana'];
shuffle(boys)
shuffle(girls)
circle = [person for pair in zip(boys, girls) for person in pair]
print(' -> '.join(circle + circle[:1]))
输出:
蒂姆 - > Priscilla - >昆西 - > Annabel - >约翰 - >珍妮特 - > Kedrick - > Jocelyn - >菲利普 - > Pamela - >乔纳森 - > Viviana - >添