美文网首页
python笔记 -- 交换圣诞礼物

python笔记 -- 交换圣诞礼物

作者: 十三_0223 | 来源:发表于2020-12-24 12:27 被阅读0次

    前言

    最近读到一篇文章,用python写个礼物交换,公司同事相互交换礼物,每个同事可以随机得到一个礼物,但是不能分到自己的,觉得很有意思,记录一下

    #员工自行抽取
    import random
    
    people = {
        "A": 1,
        "B": 2,
        "C": 3,
        "D": 4,
        "E": 5,
    }
    
    # 所有的礼物编号
    gifts = [i for i in people.values()]
    
    def get_gift():
        '''随机抽取礼物'''
        # 设置一个随机值,范围是0-礼物数量减1
        n = random.randint(0, len(gifts)-1)
        if people.get(x) == gifts[n]:
            # 判断等于自己的礼物
            get_gift()  # 重新抽取
        else:
            print("%s 取到了礼物编号 %s" % (x, gifts[n]))
            # 取到了礼物后,把礼物从礼品盒里面移除掉
            del gifts[n]
    
    if __name__ == '__main__':
        while 1:
            if len(gifts) == 0:
                print("换礼物结束!")
                exit()
            x = input("输入一个员工:")
            if x not in people.keys():
                print("输入员工名称ABCDE")
            else:
                get_gift()
    

    看起来是没有问题的,因为我们加了判断,所以每个人都不会取到自己的

        if people.get(x) == gifts[n]:
            get_gift() 
    

    那能否尝试把所有礼物都直接交换呢?

    import random
    people = {
        "A": 1,
        "B": 2,
        "C": 3,
        "D": 4,
        "E": 5,
    }
    
    # 所有的礼物编号
    gifts = [i for i in people.values()]
    
    def get_gift():
        '''随机抽取礼物'''
        # 设置一个随机值,范围是0-礼物数量减1
        n = random.randint(0, len(gifts)-1)
        if people.get(x) == gifts[n]:
            # 判断等于自己的礼物
            get_gift()  # 重新抽取
        else:
            print("%s 取到了礼物编号 %s" % (x, gifts[n]))
            # 取到了礼物后,把礼物从礼品盒里面移除掉
            del gifts[n]
    
    if __name__ == '__main__':
        for x in people.keys():
            if x not in people.keys():
                print("输入员工名称ABCDE")
            else:
                get_gift()
    

    运行得到


    咦?咋回事?为啥E没取到值,还报错了?噢,原来ABCD刚好取到前四个,E只能取自己的了,我们又规定不能取自己的,卡bug了,那么,我们继续分析:

    为了避免前面的情况,在还剩最后2个的时候,做个判断,会有3种情况
    最后2个礼物 刚好是最后2个小伙伴的,就让他们换着拿
    最后2个礼物 都不是最后2个小伙伴的,那就随便拿
    最后2个礼物 其中有1个是属于最后2个小伙伴的,那就换着拿

    import random
    people = {
        "A": 1,
        "B": 2,
        "C": 3,
        "D": 4,
        "E": 5,
    }
    
    # 所有的礼物编号
    gifts = [i for i in people.values()]
    employees = [j for j in people.keys()]
    
    def get_gift():
        '''随机抽取礼物'''
        # 判断最后2个礼物是不是有可能拿到自己的
        if len(gifts) == 2:
            # 情况1:最后2个礼物,刚好是最后2个人的
            if people[employees[0]] in gifts and people[employees[1]] in gifts:
                if people[employees[0]] == gifts[0]:
                    print("%s 取到了礼物编号 %s" % (employees[0], gifts[1]))
                    print("%s 取到了礼物编号 %s" % (employees[1], gifts[0]))
                else:
                    print("%s 取到了礼物编号 %s" % (employees[0], gifts[0]))
                    print("%s 取到了礼物编号 %s" % (employees[1], gifts[1]))
                exit()
            # 情况2:最后2个礼物,都不是最后2个人的
            elif people[employees[0]] not in gifts and people[employees[1]] not in gifts:
                print("%s 取到了礼物编号 %s" % (employees[0], gifts[0]))
                print("%s 取到了礼物编号 %s" % (employees[1], gifts[1]))
                exit()
            # 情况3:最后2个礼物有其中一个是最后2个的
            else:
                if people[employees[0]] == gifts[0]:
                    print("%s 取到了礼物编号 %s" % (employees[0], gifts[1]))
                    print("%s 取到了礼物编号 %s" % (employees[1], gifts[0]))
                else:
                    print("%s 取到了礼物编号 %s" % (employees[0], gifts[0]))
                    print("%s 取到了礼物编号 %s" % (employees[1], gifts[1]))
                exit()
    
        # 设置一个随机值,范围是0-礼物数量减1
        n = random.randint(0, len(gifts)-1)
        if people.get(x) == gifts[n]:
            # 判断等于自己的礼物
            get_gift()  # 重新抽取
        else:
            print("%s 取到了礼物编号 %s" % (x, gifts[n]))
            # 取到了礼物后,把礼物从礼品盒里面移除掉
            gifts.pop(n)
            employees.remove(x)
    
    if __name__ == '__main__':
        for x in people.keys():
            if x not in people.keys():
                print("输入员工名称ABCDE")
            else:
                get_gift()
    

    这样似乎就没问题了,运行起来也不报错了,

    但是,怎么E又取到自己了?这和计划不相符啊,,我们继续分析
    原来,我们只考虑了 if people[employees[0]] == gifts[0]:的情况,即D取到自己的,else下有0=1,1=1,1=0三种情况,而1=1是不符合需求的,继续加判断
            else:
                if people[employees[0]] == gifts[0]:
                    print("%s 取到了礼物编号 %s" % (employees[0], gifts[1]))
                    print("%s 取到了礼物编号 %s" % (employees[1], gifts[0]))
                elif people[employees[1]] == gifts[1]:
                    print("%s 取到了礼物编号 %s" % (employees[0], gifts[1]))
                    print("%s 取到了礼物编号 %s" % (employees[1], gifts[0]))
                else: 
                    print("%s 取到了礼物编号 %s" % (employees[0], gifts[0]))
                    print("%s 取到了礼物编号 %s" % (employees[1], gifts[1]))
                exit()
    
    这样就完美了😁

    (日常测试工作中也会碰到不少开发留下的诸如此类的坑。。。)

    相关文章

      网友评论

          本文标题:python笔记 -- 交换圣诞礼物

          本文链接:https://www.haomeiwen.com/subject/xwqmnktx.html