Python 循环浏览一个列表,并将项目一个接一个地附加到一组三个列表中

Python 循环浏览一个列表,并将项目一个接一个地附加到一组三个列表中,python,Python,我通过一个csv.reader()对象循环访问原始csv文件中的18行(每行都有一些关于足球运动员的信息)中的每一行,然后需要根据这些条目组成三个6人的新团队。它把我的大脑绑在一个结上;有没有一种方法可以使用for循环来实现这一点?比如,我如何循环一个列表,然后将循环的第一个项目附加到team1,第二个项目附加到team2,依此类推?我已经使用了三个列表中的random.choice(),但使用if和while语句将每个列表减少到6个条目,结果总是很奇怪 我不知道这会有多大帮助,但以下是我目前的

我通过一个csv.reader()对象循环访问原始csv文件中的18行(每行都有一些关于足球运动员的信息)中的每一行,然后需要根据这些条目组成三个6人的新团队。它把我的大脑绑在一个结上;有没有一种方法可以使用for循环来实现这一点?比如,我如何循环一个列表,然后将循环的第一个项目附加到team1,第二个项目附加到team2,依此类推?我已经使用了三个列表中的random.choice(),但使用if和while语句将每个列表减少到6个条目,结果总是很奇怪

我不知道这会有多大帮助,但以下是我目前的情况:

import csv
import random

team1 = []
team2 = []
team3 = []

teamlists = [team1, team2, team3]

with open('soccer_players.csv') as csv_file:
    player_reader = csv.reader(csv_file, delimiter=',')

    for line in player_reader:
        rando = random.choice(teamlists)
        rando.append(line)
        # Need to fill up team1, team2, team3 equally.
以下是我正在使用的CSV文件:

姓名、身高(英寸)、足球经验、监护人姓名
乔·史密斯,42岁,是的,吉姆和简·史密斯
吉尔·坦纳,36岁,是的,克拉拉·坦纳
Bill Bon,43岁,是的,Sara和Jenny Bon
伊娃·戈登,45岁,不,温迪和迈克·戈登
马特·吉尔,40岁,不,查尔斯和西尔维亚·吉尔
41岁的Kimmy Stein不是Bill和Hillary Stein
萨米·亚当斯,45岁,不,杰夫·亚当斯
卡尔·赛根,42岁,是的,希瑟·布莱索
Suzane Greenberg,44岁,是的,Henrietta Dumas
Sal Dali,41岁,不,Gala Dali
乔·卡瓦利埃,39岁,不,山姆和伊莲·卡瓦利埃
44岁的Ben Finkelstein不Aaron和Jill Finkelstein
迭戈·索托,41岁,是的,罗宾和萨丽卡·索托
克洛伊·阿拉斯加州,47岁,不,大卫和杰米·阿拉斯加州
阿诺德·威利斯,43岁,不,克莱尔·威利斯
菲利普·赫尔姆,44岁,是的,托马斯·赫尔姆和伊娃·琼斯
Les Clay 42岁是的Wynona Brown
赫歇尔·克鲁斯托夫斯基,45岁,是的,海曼和瑞秋·克鲁斯托夫斯基

此脚本将创建一个包含键编号(从0到n,其中n是最后一个团队)和值的字典,其中包含一个名称列表:

我没有使用随机方法,因为它可以创建稍微不平衡的列表

import csv

team1 = []
team2 = []
team3 = []

teamlists = [team1, team2, team3]
with open('/home/dan/Downloads/test.csv') as csv_file:
    next(csv_file) # to skip header
    player_reader = csv.reader(csv_file, delimiter=',')
    team_index = 0
    for line in player_reader:
        current_list_number = team_index % 3
        teamlists[current_list_number].append(line[0])
        team_index += 1

print teamlists
# will output:
# [['Joe Smith', 'Eva Gordon', 'Sammy Adams', 'Sal Dali', 'Diego Soto', 'Phillip Helm'], ['Jill Tanner', 'Matt Gill', 'Karl Saygan', 'Joe Kavalier', 'Chloe Alaska', 'Les Clay'], ['Bill Bon', 'Kimmy Stein', 'Suzane Greenberg', 'Ben Finkelstein', 'Arnold Willis', 'Herschel Krustofski']]

首先,输入文件中有一个标题行,因此必须跳过它

然后,第一个想法是只选择第一列(名称)附加到使用
random.choice(teamlists)

但它可能不会像这样平均分配值,因为这样或那样的子列表可能比其他子列表更频繁地被选择

为了得到一个有保证的均匀分布(当然前提是名单可以除以3),我会这样做:

teams = [[] for _ in range(3)]

with open('soccer_players.csv') as csv_file:
    player_reader = csv.reader(csv_file, delimiter=',')
    next(player_reader) # skip title line
    names = [line[0] for line in player_reader]
    random.shuffle(names)
    for i,n in enumerate(names):
        teams[i%len(teams)].append(n)

姓名
是球员姓名列表。使用
random.shuffle
随机更改顺序。然后使用一个带模的简单循环来分派值

您可以平均填写3个列表(前提是csv的数据可以被3整除),如下所示:

import csv
import random

team1 = []
team2 = []
team3 = []

teamlists = [team1, team2, team3]

with open('soccer_players.csv') as csv_file:
    player_reader = csv.reader(csv_file, delimiter=',')
    next(player_reader, None)  # skip the headers


    for idx,line in enumerate(player_reader):
        if idx % 3 == 0:
            team1.append(line)
        elif idx % 3 == 1:
            team2.append(line)
        if idx % 3 == 2:
            team3.append(line)

print "team1 = {}".format(team1)
print "----------------------------------------"
print "team2 = {}".format(team2)
print "----------------------------------------"
print "team3 = {}".format(team3) 
输出:

Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
team1 = [['Joe Smith', '42', 'YES', 'Jim and Jan Smith'], ['Eva Gordon', '45', 'NO', 'Wendy and Mike Gordon'], ['Sammy Adams', '45', 'NO', 'Jeff Adams'], ['Sal Dali', '41', 'NO', 'Gala Dali'], ['Diego Soto', '41', 'YES', 'Robin and Sarika Soto'], ['Phillip Helm', '44', 'YES', 'Thomas Helm and Eva Jones']]
----------------------------------------
team2 = [['Jill Tanner', '36', 'YES', 'Clara Tanner'], ['Matt Gill', '40', 'NO', 'Charles and Sylvia Gill'], ['Karl Saygan', '42', 'YES', 'Heather Bledsoe'], ['Joe Kavalier', '39', 'NO', 'Sam and Elaine Kavalier'], ['Chloe Alaska', '47', 'NO', 'David and Jamie Alaska'], ['Les Clay', '42', 'YES', 'Wynonna Brown']]
----------------------------------------
team3 = [['Bill Bon', '43', 'YES', 'Sara and Jenny Bon'], ['Kimmy Stein', '41', 'NO', 'Bill and Hillary Stein'], ['Suzane Greenberg', '44', 'YES', 'Henrietta Dumas'], ['Ben Finkelstein', '44', 'NO', 'Aaron and Jill Finkelstein'], ['Arnold Willis', '43', 'NO', 'Claire Willis'], ['Herschel Krustofski', '45', 'YES', 'Hyman and Rachel Krustofski']]
>>> len(team1)
6
>>> len(team2)
6
>>> len(team3)
6

我不会像你尝试的那样使用循环来创建团队

相反,如果你先把所有的球员都读入一个名单,然后把这个名单洗牌,那么只需把它切成三分之一就可以创建球队名单。这种方法还可以相对容易地将被洗牌的玩家列表划分为不同数量的团队

以下说明了如何做到这一点:

import csv
import random

with open('soccer_players.csv') as csv_file:
    next(csv_file)  # skip header row
    players = [row[0] for row in csv.reader(csv_file, delimiter=',')]

random.shuffle(players)
team1, team2, team3 = [players[i::3] for i in range(3)]

# display results
for i, team in enumerate([team1, team2, team3], 1):
    print('team{}: {}'.format(i, team))
输出:

team1:['Chloe Alaska','Ben Finkelstein','Phillip Helm','Joe Smith','Kimmy Stein','Arnold Willis']
第二组:['Matt Gill','Jill Tanner','Diego Soto','Les Clay','Herschel Krustofski','Bill Bon']
团队3:['Joe Kavalier','Karl Saygan','Eva Gordon','Sammy Adams','Sal Dali','Suzane Greenberg']

您的csv文件中有多少列?你期望我是什么样的人
rando.append(第[0]行)如果只有一个玩家的话,它可能会工作。
你只是想把csv中的这18个玩家随机分配到3个不同的团队吗?@juanpa.arrivillaga:是的,没错。你可以共享csv文件吗?@nicecore,你最好使用
@username
语法,否则,不会通知用户您的评论。