将16个团队中的随机团队分配给8个人中的一个随机人[重复]
Posted
技术标签:
【中文标题】将16个团队中的随机团队分配给8个人中的一个随机人[重复]【英文标题】:Assign random team out of 16 teams to a random person out of 8 people [duplicate] 【发布时间】:2016-10-11 10:22:15 【问题描述】:我正在尝试将 16 个团队中的两个团队分配给 8 个人中的 8 个人,
这是我所拥有的:
import random
person = ['Ashton', 'Danny', 'Martin', 'Yves', 'Nick', 'Cormac', 'Thierry', 'Ciaran']
team = ['France', 'Switzerland', 'England', 'Slovakia', 'Germany', 'Ukraine', 'Spain', 'Czech Republic', 'Croatia', 'Italy', 'Republic of Ireland', 'Sweden', 'Russia', 'Wales', 'Belgium']
namesTeams =
for x in person:
teamName = team[random.randint(0, len(team) -1)]
namesTeams[x] = teamName
team.remove(teamName)
print(namesTeams)
【问题讨论】:
【参考方案1】:这可以通过random.choice([List])
来完成
例子:
import random
persons = ['Name', 'Name', 'Name', 'Name', 'Name', 'Name', 'Name', 'Name']
teams = ['France', 'Switzerland', 'England', 'Slovakia', 'Germany', 'Ukraine', 'Spain', 'Czech Republic', 'Croatia', 'Italy', 'Republic of Ireland', 'Sweeden', 'Russia', 'Wales', 'Belgium']
combinations = p: random.choice(teams) for p in persons
结果是字典。
如果你想避免重复,你必须遍历列表。
combinations =
for p in persons:
team = random.choice(teams)
combinations[p] = team
teams.remove(team)
【讨论】:
是的,这适用于 python3 和 python2.7 您的代码中有错字,它是teams
,而不是team
。此外,例如,这只会产生一个结果'Name': 'Ukraine'
。
谢谢,我纠正了错字。不,这将创建一个字典,为每个名称分配一个随机团队
我很困惑,因为'Name'
是字典中唯一的键。但你是对的,只要所有键都不同,这将产生正确的结果。【参考方案2】:
使用random.choice()
。在您的情况下,您可能有以下情况:
import random
names = ['Name1', 'Name2', 'Name3']
teams = ['France', 'Switzerland', 'England', 'Slovakia', 'Germany', 'Ukraine', 'Spain', 'Czech Republic', 'Croatia', 'Italy', 'Republic of Ireland', 'Sweeden', 'Russia', 'Wales', 'Belgium']
people = []
for name in names:
people.append(random.choice(names), random.choice(teams))
people
将是名称和团队的元组列表。
【讨论】:
这只会创建一个组合,并且所有人都需要一个组合。【参考方案3】:这将创建一个字典,其中包含附加到团队的名称,没有重复
import random
person = ['Name1', 'Name2', 'Name3', 'Name4', 'Name5', 'Name6', 'Name7', 'Name8']
team = ['France', 'Switzerland', 'England', 'Slovakia', 'Germany', 'Ukraine', 'Spain', 'Czech Republic', 'Croatia', 'Italy', 'Republic of Ireland', 'Sweden', 'Russia', 'Wales', 'Belgium']
namesTeams =
for x in person:
teamName = team[random.randint(0, len(team) - 1)]
namesTeams[x] = teamName
team.remove(teamName)
print(namesTeams)
【讨论】:
【参考方案4】:所以您要做的只是从teams
中随机选择“names
的长度”元素。在这种情况下,您应该使用random.sample()
:
>>> import random
>>> person = ['Name', 'Name', 'Name', 'Name', 'Name', 'Name', 'Name', 'Name']
>>> team = ['France', 'Switzerland', 'England', 'Slovakia', 'Germany', 'Ukraine', 'Spain', 'Czech Republic', 'Croatia', 'Italy', 'Republic of Ireland', 'Sweeden', 'Russia', 'Wales', 'Belgium']
>>> random.sample(team, len(person))
['Ukraine', 'Russia', 'England', 'Croatia', 'France', 'Spain', 'Italy', 'Wales']
来自the documentation:
random.sample(population, k)
返回一个
k
长度列表,其中包含从种群序列或集合中选择的唯一元素。用于无放回的随机抽样。返回一个包含种群元素的新列表,同时保持原始种群不变。结果列表按选择顺序排列,因此所有子切片也将是有效的随机样本。这允许将抽奖获胜者(样本)划分为大奖和第二名(子片)。
如果你想为每个人分配两个团队,我建议你 random.shuffle()
team
列表,然后将列表分成 2 个大小的块,并将结果放入字典中:
person: two_teams for person, two_teams in
zip(people, [team[i:i+2] for i in range(0, len(team), 2)])
【讨论】:
以上是关于将16个团队中的随机团队分配给8个人中的一个随机人[重复]的主要内容,如果未能解决你的问题,请参考以下文章