1. 程式人生 > 實用技巧 >Python程式設計題14--隨機分配禮物

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