【问题标题】:Assign random team out of 16 teams to a random person out of 8 people [duplicate]将16个团队中的随机团队分配给8个人中的一个随机人[重复]
【发布时间】: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)

【问题讨论】:

    标签: python arrays list random


    【解决方案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)])}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-23
        • 2016-01-21
        • 2015-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多