秘密圣诞老人游戏的双向匹配

时间:2016-02-03 14:54:31

标签: python

我正在尝试编写一个脚本,将男性和女性配对以进行秘密的圣诞老人类型活动。所以我有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

3 个答案:

答案 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 - >添