Python程式設計題14--隨機分配禮物
阿新 • • 發佈:2020-10-18
題目
已知有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)))