2016-02-03 28 views
1

我想写一个脚本,配对男性和女性的秘密圣诞老人类型的事件。所以我有两个男孩和女孩的名单,并且想要进行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 
+4

一个小技巧只是[ 'shuffle']( https://docs.python.org/3/library/random.html#random.shuffle)列表之一并按索引映射。它更容易 –

+0

Kedrick和Tim如何连接?还是只是错字? – Lafexlos

+0

@Lafexlos他们之间没有任何联系 – methuselah

回答

2

这可能可以用更少的循环和更少的代码完成,但这里是我的解决方案!创建了2个字典来存储名称和目标(字典可以同时组合或完成,以减少内存问题,但对于这个大小的程序,我认为您不会遇到这个问题!

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

将这两个列表随机洗并放入一个环中,每个其他元素来自第一个或第二个列表。每个人都会向右边的人赠送礼物。类似于这样的列表的东西:

[Girl, Boy, Girl, Boy, ..., Boy] 

最后一个元素给第一个礼物。

它的工作原理是这两个表中的元素数量相同,并且总共至少有四个元素,否则问题无法解决。

这给出了一个解决方案,可以满足您的约束条件。该问题的一般解决方案是在每个顶点恰好具有两个边缘,一个入口和一个出口的集合之间找到定向bipartite graph。也许这个问题的解决方案也总是会产生一个响铃?

+0

我几乎可以肯定,我的最后一句话是真实的,但我把它作为一个练习给读者:-) –

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

输出:。

Tim -> Priscilla -> Quincy -> Annabel -> John -> Janet -> Kedrick -> Jocelyn -> Philip -> Pamela -> Jonathan -> Viviana -> Tim