題目
已知有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)))