【问题标题】:Two way matching for Secret Santa game [duplicate]秘密圣诞老人游戏的两种方式匹配[重复]
【发布时间】:2016-02-03 14:54:31
【问题描述】:

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

【问题讨论】:

  • 一个小技巧。只需shuffle 列表之一并按索引映射。工作起来更容易
  • Kedrick 和 Tim 是如何联系起来的?还是只是错字?
  • @Lafexlos 两者之间没有联系
  • 这是您的实际代码吗?除其他问题外,我预计 del girls(rand) 会与 TypeError: 'list' object is not callable 崩溃。
  • 好的,好吧,继续将图片转录成文本,然后编辑到您的帖子中。当您可以复制/粘贴/运行代码时,调试代码会容易得多。

标签: python


【解决方案1】:

这可以通过更少的循环和更少的代码来完成,但这是我的解决方案!创建了 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'])

【讨论】:

    【解决方案2】:

    打乱两个列表并将它们放在一个环中,每个其他元素都来自第一个或第二个列表。每个人都给他们右边的人一份礼物。类似于这样的列表:

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

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

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

    这提供了一种满足您的限制条件的解决方案。该问题的一般解决方案是在集合之间找到一个有向bipartite graph,其中每个顶点正好有两条边,一条入边和一条出边。也许这个问题的解决方案也总是会产生一个环?

    【讨论】:

    • 我几乎可以肯定我的最后一句话是正确的,但我把它作为练习留给读者:-)
    【解决方案3】:

    这是一个用交替的男孩和女孩创建一个圆圈的实现。请参阅@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]))
    

    输出:

    蒂姆 -> 普莉希拉 -> 昆西 -> 安娜贝尔 -> 约翰 -> 珍妮特 -> 凯德里克 -> Jocelyn -> Philip -> Pamela -> Jonathan -> Viviana -> Tim

    【讨论】:

      猜你喜欢
      • 2010-09-21
      • 2013-11-10
      • 2016-05-23
      • 2022-01-12
      • 1970-01-01
      • 2022-01-15
      • 2012-01-26
      • 2022-11-17
      • 1970-01-01
      相关资源
      最近更新 更多