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

更多Python编程题,等你来挑战:Python编程题汇总(持续更新中……)

你可能感兴趣的:(Python编程题14--随机分配礼物)