将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个人中的一个随机人[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将值分配给数组中的随机位置?

如何衡量个人在团队中的绩效?

为什么将值分配给数组中的特定位置,将同一值分配给同一数组中的其他随机位置?

译如何为团队定义CSS标准

随机组队感想

如何将数组中的类随机分配给for循环中创建的元素