python最少数量的礼物_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)))

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值