zoukankan      html  css  js  c++  java
  • Python编程题14--随机分配礼物

    题目

    已知有5个人,每人手上都有一个不同的礼物,现在需要对5个人的礼物重新进行分配(也可以理解为5个人互换礼物),要求重新分配后,每个人不能再拿到自己原来的礼物。

    实现思路1

    • 利用 字典 来存储最开始的5个人及其礼物,再设置一个新字典,用于存储分配后的结果
    • 利用字典的 keys()values() 方法,分别得到 人员列表user_list 和 礼物列表gift_list
    • 重新分配时,利用 random 内置模块的 choice() 方法,可以从 gift_list 中随机取出礼物
    • 每次均从 user_list 中取第一个人,在字典中查找该人的礼物,比较随机取出的礼物是否是原来的礼物,如果不是,那么就将随机取的礼物分配给该人,否则就将随机取的礼物分配给 user_list 的第二个人
    • 将已分配好的人员和礼物,存储到新字典中,并从 user_list 和 gift_list 中,分别删除掉已分配好的人员和礼物
    • 执行循环,继续进行分配,直到只剩2个人和2个礼物未被重新分配
    • 当 user_list 只剩2个人时,不再从 gift_list 随机取出礼物,而是通过判断 user_list[0] 对应的礼物 gift_list[0] 或 user_list[1] 对应的礼物 gift_list[1] ,是否是自己原来的礼物,如果是则二者进行礼物交换,否则直接进行指定分配

    代码实现

    import random
    
    def distribute_gift(data):
        result = {}
        user_list = list(data.keys())
        gift_list = list(data.values())
        while True:
            if len(user_list) != 2:
                random_gift = random.choice(gift_list)
                if data[user_list[0]] != random_gift:
                    result[user_list[0]] = random_gift
                    user_list.remove(user_list[0])
                else:
                    result[user_list[1]] = random_gift
                    user_list.remove(user_list[1])
                gift_list.remove(random_gift)
            else:
                if (data[user_list[0]] == gift_list[0]) or (data[user_list[1]] == gift_list[1]):
                    result[user_list[0]] = gift_list[1]
                    result[user_list[1]] = gift_list[0]
                else:
                    result[user_list[0]] = gift_list[0]
                    result[user_list[1]] = gift_list[1]
                break
        return result
    
    data = {"A": "礼物A", "B": "礼物B", "C": "礼物C", "D": "礼物D", "E": "礼物E"}
    print("随机分配后:{}".format(distribute_gift(data)))
    

    实现思路2

    • 利用 字典 来存储最开始的5个人及其礼物,再设置一个新字典,用于存储分配后的结果
    • 利用字典的 values() 方法,得到 所有礼物列表 list1 ,重新分配后的礼物列表 list2
    • 设置一个额外的待分配礼物列表 new_list ,其包括那些在 list1 中但不在 list2 中的礼物
    • 对字典进行遍历,遍历时的键key,存储的就是已知的5个人员
    • 遍历过程中,再通过 while 循环来分配礼物,每次从 待分配礼物列表 new_list 中随机取出一个礼物,并把该礼物分配给当前要分配的人,如果该礼物恰是这个人原来的礼物,那么继续随机抽取。
    • 将已分配好的人员和礼物,存储到新字典中
    • 如果分到最后,最后这个礼物恰好是最后一个人的,那么就从已分配好的人中,随机抽一个人来和最后一个人交换礼物,这样就可以保证每个人拿到的不再是自己原来的礼物。

    代码实现

    import random
    
    def distribute_gift(data):
        result = {}
        list1 = list(data.values())
        for user in data:
            list2 = list(result.values())
            new_list = [i for i in list1 if i not in list2]
            if (len(new_list)) == 1 and (data[user] == new_list[0]):
                last_gift = new_list[0]
                random_user = random.choice(list(result.keys()))
                result[user] = result[random_user]
                result[random_user] = last_gift
                break
            while not result.get(user): # 如果result中没有这个人员,则可分配礼物
                random_gift = random.choice(new_list)
                if data[user] != random_gift:
                    result[user] = random_gift
        return result
    
    data = {"A": "礼物A", "B": "礼物B", "C": "礼物C", "D": "礼物D", "E": "礼物E"}
    print("随机分配后:{}".format(distribute_gift(data)))
    
  • 相关阅读:
    手动在本机仓库中放置jar包以解决Maven中央仓库不存在该资源的问题
    同一套代码部署到两台机器上,只有一台机器上的页面中文乱码
    Nginx与httpd共存
    [Z3001] connection to database 'zabbix' failed: [2003] Can't connect to MySQL server on 'x.x.x.x' (13)
    Excel中时间戳转换公式及原理
    springcloud服务注册和发现
    spingboot和springcloud简记
    postgres use
    访问者模式
    uml类图详解
  • 原文地址:https://www.cnblogs.com/wintest/p/13835536.html
Copyright © 2011-2022 走看看