假設我有兩個陣列
people = ['tom', 'dick', 'harry']
gifts = ['toms', 'dicks', 'harrys']
我想將一個人隨機分配給一份禮物,但我不想將他們分配給他們自己的。
我遇到了麻煩,因為像 random.choice 這樣的解決方案不知道不挑選一個人自己的禮物的限制。我目前的技巧是隨機移動禮物串列(1,n-1),但顯然這不是隨機的。
我覺得我錯過了一些明顯的東西?任何常見的方法來做到這一點?
uj5u.com熱心網友回復:
這應該對你有用。
import random
people = ['tom', 'dick', 'harry', 'arne']
gifts = ['toms', 'dicks', 'harrys', 'arne']
# assign each person a gift randomly but not at the
# same index and don't repeat the same gifts twice so remove them
gift_dict = {}
for people_index in range(len(people)):
gift_choice = people_index
while gift_choice == people_index:
gift_choice = gifts.index(random.choice(gifts))
gift_dict[people[people_index]] = gifts[gift_choice]
gifts.pop(gift_choice)
print(gift_dict)
輸出
{'tom': 'harrys', 'dick': 'arne', 'harry': 'dicks', 'arne': 'toms'}
uj5u.com熱心網友回復:
您可以使用random.shuffle()來隨機播放您的串列之一,然后您可以使用zip()它們。這應該可以解決問題而不必擔心記憶體。
import random
people = ['tom', 'dick', 'harry']
gifts = ['toms', 'dicks', 'harrys']
random.shuffle(gifts)
results = dict(zip(people, gifts))
print(results)
uj5u.com熱心網友回復:
假設沒有人收到多于一件的禮物(如果可以的話,您可以查看一下itertools.product)。訣竅是讓每個人找到任何“有效接收者”來申請random.choice()。主要標準似乎是你不能給自己或給你的人:
我相信會有更有效的解決方案,但這會讓你開始:
import random
givers = ['tom', 'dick', 'harry', "joe"]
receivers = givers.copy()
receivers_givers = {}
for giver in givers:
# ---------------------
# You can't give to yourself or to the person who gave to you.
# ---------------------
valid_receivers = [reciever for reciever in receivers if reciever not in (giver, receivers_givers.get(giver))]
# ---------------------
receiver = random.choice(valid_receivers)
receivers.remove(receiver)
receivers_givers[receiver] = giver
for reciever, giver in receivers_givers.items():
print(f"{giver} gifts to {reciever}")
那應該給你類似的東西:
tom gifts to joe
dick gifts to harry
harry gifts to tom
joe gifts to dick
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/391646.html
