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编程题汇总(持续更新中……)
作者:wintest
本文版权归作者和博客园共有,欢迎转载,但必须在文章页面明显位置给出原文链接,并保留此段声明,否则保留追究法律责任的权利。