Python編程題14--隨機分配禮物

題目

已知有5個人,每人手上都有一個不同的禮物,現(xiàn)在需要對5個人的禮物重新進行分配(也可以理解為5個人互換禮物),要求重新分配后,每個人不能再拿到自己原來的禮物。

實現(xiàn)思路1

  • 利用 字典 來存儲最開始的5個人及其禮物,再設(shè)置一個新字典,用于存儲分配后的結(jié)果
  • 利用字典的 keys()values() 方法,分別得到 人員列表user_list 和 禮物列表gift_list
  • 重新分配時,利用 random 內(nèi)置模塊的 choice() 方法,可以從 gift_list 中隨機取出禮物
  • 每次均從 user_list 中取第一個人,在字典中查找該人的禮物,比較隨機取出的禮物是否是原來的禮物,如果不是,那么就將隨機取的禮物分配給該人,否則就將隨機取的禮物分配給 user_list 的第二個人
  • 將已分配好的人員和禮物,存儲到新字典中,并從 user_list 和 gift_list 中,分別刪除掉已分配好的人員和禮物
  • 執(zhí)行循環(huán),繼續(xù)進行分配,直到只剩2個人和2個禮物未被重新分配
  • 當 user_list 只剩2個人時,不再從 gift_list 隨機取出禮物,而是通過判斷 user_list[0] 對應(yīng)的禮物 gift_list[0] 或 user_list[1] 對應(yīng)的禮物 gift_list[1] ,是否是自己原來的禮物,如果是則二者進行禮物交換,否則直接進行指定分配

代碼實現(xiàn)

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

實現(xiàn)思路2

  • 利用 字典 來存儲最開始的5個人及其禮物,再設(shè)置一個新字典,用于存儲分配后的結(jié)果
  • 利用字典的 values() 方法,得到 所有禮物列表 list1 ,重新分配后的禮物列表 list2
  • 設(shè)置一個額外的待分配禮物列表 new_list ,其包括那些在 list1 中但不在 list2 中的禮物
  • 對字典進行遍歷,遍歷時的鍵key,存儲的就是已知的5個人員
  • 遍歷過程中,再通過 while 循環(huán)來分配禮物,每次從 待分配禮物列表 new_list 中隨機取出一個禮物,并把該禮物分配給當前要分配的人,如果該禮物恰是這個人原來的禮物,那么繼續(xù)隨機抽取。
  • 將已分配好的人員和禮物,存儲到新字典中
  • 如果分到最后,最后這個禮物恰好是最后一個人的,那么就從已分配好的人中,隨機抽一個人來和最后一個人交換禮物,這樣就可以保證每個人拿到的不再是自己原來的禮物。

代碼實現(xiàn)

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編程題,等你來挑戰(zhàn):Python編程題匯總(持續(xù)更新中……)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容