【问题标题】:random team generator with varying number of teams具有不同数量团队的随机团队生成器
【发布时间】:2020-11-20 08:08:48
【问题描述】:

所以我即将学习如何在 python 中编码,因此我正在尝试制作一个随机团队生成器,如下所示。

目前,我有一个输出。但是,我的输出不是我想要的。 我一直在寻找一种方法来保存 while 循环中的数据并将其导出到在 for 循环中创建的列表并每次保存数据。然而,这似乎是一项不可能完成的任务。

#team selector
import random
player_list=[]
players=int(input('input number of players: '))
teams= int(input('input number of teams: '))

if players<teams:
    print('to many teams, to few players')
else:
    
    for i in range(0, players):
        names =input('input player {0}: '.format(i+1))
        player_list.append(names)
    print(player_list)
    
    while len(player_list)>0:
        for i in range(0, teams):
            q=i+1
            teamq=[]
            
            while len(player_list)>0:
                z=i+1
                playerz=random.choice(player_list)
                teamq.append(playerz)
                player_list.remove(playerz)
                break
                
                if player_list==[]:
                    break
         
            print('team {0} is '.format(q), teamq)

所以目前我的输出是例如

input number of players: 5
input number of teams: 3
input player 1: James
input player 2: peter
input player 3: john
input player 4: ann
input player 5: Jackson
['James', 'Peter', 'John', 'Ann', 'Jackson']
team 1 is  ['Peter']
team 2 is  ['Jackson']
team 3 is  ['James']
team 1 is  ['Ann']
team 2 is  ['John']
team 3 is  []

而我想要的是

input number of players: 5
input number of teams: 3
input player 1: James
input player 2: peter
input player 3: john
input player 4: ann
input player 5: Jackson
['James', 'Peter', 'John', 'Ann', 'Jackson']
team 1 is  ['Peter', 'Ann']
team 2 is  ['Jackson', 'John']
team 3 is  ['James']

谁能帮帮我?

【问题讨论】:

  • 尝试使用random.sample()import mathplayerz=random.sample(player_list, min(math.ceil(players/teams), len(player_list))

标签: python


【解决方案1】:

对不起,亲爱的,它仅适用于当球员完全被球队整除的那些数字:

例如玩家 = 6

团队 = 3

import random
player_list=[]
players=int(input('input number of players: '))
teams= int(input('input number of teams: '))

if players<teams:
    print('to many teams, to few players')
else:
    for i in range(0, players):
        names =input('input player {0}: '.format(i+1))
        player_list.append(names)
    print(player_list)
    
max_members = players//teams

teams_2d_list = [[] for i in range(teams)]


for i in range(teams):
    for j in range(max_members):
        if len(player_list) == 0:
            break
        a_rand_player = player_list.pop(random.randint(0,len(player_list)-1)) 
        #get a random element from player_list them pop/remove it 
        teams_2d_list[i].append(a_rand_player)
print("\n",teams_2d_list)
        
for i in range(teams):
    print("team{} ".format(i),"is ",teams_2d_list[i])
        

输出:

[['bcd', 'abc'], ['jkp', 'sour'], ['def', 'fgh']]
team0 is ['bcd', 'abc']
team1 is ['jkp', 'sour']
team2 is ['def', 'fgh']

【讨论】:

    【解决方案2】:

    在下面试试我的。

    请注意,我添加了一些 cmets,并对代码中的变量名进行了一些更改。

    import random, sys
    
    # multiple assignment
    players, p, teams = [], int(input('input number of players: ')), int(input('input number of teams: '))
    
    if p < teams:
        # if this block is true, print message and 
        # finish program instead of going through codes below
        print('too many teams, too few players')
        sys.exit()
    
    for i in range(p):
        n = input('input player {}: '.format(i+1))
        n = n[0].upper() + n[1:] # first letter of each name capitalised 
        players.append(n)
    print(players)
    
    # make an empty list and inside it append each empty list
    # length of teams times using list comprehension.
    # use _ when you don't ever use it
    team_g = [list() for _ in range(teams)]
    
    while len(players) > 0:
        for i in range(teams):
            p=random.choice(players)
            team_g[i].append(p)
            players.remove(p)
            if not players: # if players is empty 
                break
        continue # to prevent infinite loop
    
    for i in range(teams):
        print( 'Team {} is {}'.format(i+1, team_g[i]) )
    

    【讨论】:

      【解决方案3】:

      这是使用 random.choices(创建球队列表)和 defaultdict(链接球队和球员)的解决方案:

      导入包并初始化变量:

      from collections import defaultdict
      from random import choices
      
      players = ['James', 'Peter', 'John', 'Ann', 'Jackson']
      
      # ensure every team has at least one member
      teams = ['team-1', 'team-2', 'team-3']
      
      # and add random teams, so len(teams) == len(players)
      teams += choices(teams, k = len(players) - len(teams))
      
      # each value in the default dict is a list (initially empty)
      roster = defaultdict(list)
      

      现在将每个玩家分配到一个团队; roster 是一个默认字典,使得值是列表;它来自内置的collections 包。

      for team, player in zip(teams, players):
          roster[team].append(player)
      

      最后,展示每个团队的成员:

      for team in sorted(set(teams)):
          print(team, '\t', roster[team])
      
      team-1   ['James', 'Jackson']
      team-2   ['Peter', 'Ann']
      team-3   ['John']
      

      【讨论】:

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