Python 口述和列表问题

Python 口述和列表问题,python,list,dictionary,Python,List,Dictionary,我试图逐行读取文件,并在读取时删除项目。我不知道我做错了什么。同一天有多个条目,所以我不得不用它们编一本字典 我的剧本: ''' Read test data into simple dictionary for later use. ''' matches_date = {} with open('testi_data.csv','rb') as f: for row in csv.reader(f, delimiter=';'): if row[0] not in m

我试图逐行读取文件,并在读取时删除项目。我不知道我做错了什么。同一天有多个条目,所以我不得不用它们编一本字典

我的剧本:

'''
Read test data into simple dictionary for later use.
'''
matches_date = {}
with open('testi_data.csv','rb') as f:
    for row in csv.reader(f, delimiter=';'):
        if row[0] not in matches_date:
            matches_date[row[0]] = []
        matches_date[row[0]].append(row)
f.close()

'''
Read dictionary values sorted by date. Remove item when read.
'''
for item in sorted(matches_date.keys()):
    for match in matches_date[item]:

        if match[1] == 'blue':
            score = [1,0]
        else:
            score = [0,1

        date = match[0]
        home = match[7]
        away = match[8]
        home_team = match[13]
        away_team = match[14]
        region = match[30]

        print date, home, away, score
        matches_date[date].remove(match)
输出:

20170510 G2电子竞技SK电信T1[0,1]
20170510千兆字节海军陆战队团队SoloMid[1,0]
20170510 SK电信T1千兆字节海军陆战队[1,0]
当我希望它打印此文件(testi_data.csv)中的每一行时:

20170510;红色7.8;;;;;G2电子竞技;SK电信T1;凯宁、隆隆声、因果报应、嘶嘶声、沈;勒布朗,未来守护者,露露,菲奥娜,跳板;雷内克顿、李辛、奥莉安娜、阿什、兹拉;加利奥,格雷夫斯,辛德拉,瓦鲁斯,福琼小姐;期待,诡计,佩尔兹,兹文,成年礼;胡尼、花生、骗子、邦、狼(李在万);43:53;71.8k;6.3.0;0;1.86.1k;10;11;5.2.0;2017赛季中期邀请赛/主要赛事/记分牌;http://matchhistory.na.leagueoflegends.com/en/#match-详细信息/TRLH1/1002180106?gameHash=6000b59281dff531&tab=概述;国际的
20170510;蓝色7.8;;;;;我们队;闪电狼;综合体,勒布朗,ZyRA,沈,古拉加斯;露露、卡玛、格雷夫斯、塔姆肯奇、纳米;克莱德、伊利斯、塔利亚、阿什、巴德;隆隆声,李辛,瑞兹,瓦鲁斯,马尔扎哈尔;957,康迪,西耶,神秘主义者,本;MMD、卡萨、枫树(黄一堂)、贝蒂、斯沃达特;29:50;59.7k;16;9;1.1.1.48.1k;13;2.1.0;0;2017赛季中期邀请赛/主要赛事/记分牌;http://matchhistory.na.leagueoflegends.com/en/#match-详细信息/TRLH1/1002180124?gameHash=a3c01e30df8a98a8;国际的
20170510;蓝色7.8;;;;;千兆字节的海军陆战队;索洛米德小组;艾文、加利奥、阿什、凯特琳、埃兹雷亚尔;吉格斯,凯南,Syrda,Lee Sin,勒布朗;格拉加斯、卡齐克斯、阿赫里、瓦鲁斯、卡玛;鹦鹉螺、格雷夫斯、露露、特维奇、纳米;斯塔克(潘昌明)、李维、擎天柱、斯雷、阿尔奇(Trầ新罕布什尔州n明ựt) );费特泽尔、斯文斯克伦、比尔格森、野海龟、生物霜;36:11;69k;16;11;2.1.0;59.2k;15;4.2.0;0;2017赛季中期邀请赛/主要赛事/记分牌;http://matchhistory.na.leagueoflegends.com/en/#match-详细信息/TRLH1/1002180130?gameHash=03336bc5758a759d;国际的
20170510;红色7.8;;;;;闪电狼;G2电子竞技;房祖名,凯宁,菲奥拉,雷克顿,沈,;阿什,格雷夫斯,李辛,克莱德,隆隆;古拉加斯、雷恩加尔、勒布朗、Varus、露露;鹦鹉螺、艾文、瑞兹、凯特琳、因果报应;MMD、卡萨、枫树(黄一堂)、贝蒂、斯沃达特;期待,诡计,佩尔兹,兹文,成年礼;46:27;81.6k;10;6.3.1.0;78.1k;8.8.1.0;0;2017赛季中期邀请赛/主要赛事/记分牌;http://matchhistory.na.leagueoflegends.com/en/#match-详细信息/TRLH1/1002180138?gameHash=5604703d17a7f2a4;国际的
20170510;蓝色7.8;;;;;SK电信T1;千兆字节的海军陆战队;勒布朗,古拉加斯,Ziggs,沈,菲兹;加利奥、凯宁、埃兹雷亚尔、特维奇、科莫;隆隆声、李辛、埃科、瓦鲁斯、露露;房东,格雷夫斯,辛德拉,阿什,因果报应;胡尼、花生、骗子、邦、狼(李在万);斯塔克(潘昌明)、李维、擎天柱、斯雷、阿尔奇(Trầ新罕布什尔州n明ựt) );26:45;58.3k;25;9;3.1.0;43.5k;12;0;0;0;0;2017赛季中期邀请赛/主要赛事/记分牌;http://matchhistory.na.leagueoflegends.com/en/#match-详细信息/TRLH1/1002180145?gameHash=2ba736f5ffe8a59c&tab=概述;国际的
20170510;蓝色7.8;;;;;索洛米德小组;我们队;勒布朗,菲兹,卢西恩,KLED;艾文、瓦鲁斯、辛德拉、瑞兹、奥里安娜;凯宁、李善、塔利耶、埃兹雷亚尔、卢鲁;房祖名、伊利斯、卡玛、阿什、纳米;费特泽尔、斯文斯克伦、比尔格森、野海龟、生物霜;957,康迪,西耶,神秘主义者,本;39:10;74.3k;10;11;2.2.0;63.5k;6.2.2.0;0;2017赛季中期邀请赛/主要赛事/记分牌;http://matchhistory.na.leagueoflegends.com/en/#match-详细信息/TRLH1/1002180154?gameHash=e1b11e4d1901c49b;国际的

我需要能够删除这些已读项,以便进一步使用字典。

迭代列表时不要删除项。它会导致你意想不到的行为。有一个解释。由于您的代码将删除所有元素,并为
匹配项的日期[项目]
留下空列表,因此您只需将
匹配项的日期[项目]=[]
放在内部循环之外即可

迭代列表时不要删除项目。它会导致你意想不到的行为。有一个解释。由于您的代码将删除所有元素,并为
匹配项的日期[项目]
留下空列表,因此您只需将
匹配项的日期[项目]=[]
放在内部循环之外即可

回答,因为我想粘贴一个代码示例

正如@gzc所提到的,在for循环中,不要从正在迭代的列表中删除。当您删除一个项目时,整个列表将重新排列到左侧,而索引将继续前进(或者更准确地说,在循环结束之前保持在同一位置)。删除索引的每一项都会跳过另一项您可能想要查看的内容

lst = ["abc", "abc2", "abc3", "abc4", "abc5"]

for i, var in enumerate(lst):
    print("index: " + str(i) + " var: " + var)
    lst.remove(lst[i])
print(lst)
对于该代码,结果是:

index: 0 var: abc
index: 1 var: abc3
index: 2 var: abc5
['abc2', 'abc4']

删除项时,必须向后移动索引,并且不能在for循环中完成。最好使用while循环,以便在删除项目时将索引向后移动。

回答问题,因为我想粘贴一个代码示例

正如@gzc所提到的,在for循环中,不要从正在迭代的列表中删除。当您删除一个项目时,整个列表将重新排列到左侧,而索引将继续前进(或者更准确地说,在循环结束之前保持在同一位置)。删除索引的每一项都会跳过另一项您可能想要查看的内容

lst = ["abc", "abc2", "abc3", "abc4", "abc5"]

for i, var in enumerate(lst):
    print("index: " + str(i) + " var: " + var)
    lst.remove(lst[i])
print(lst)
对于该代码,结果是:

index: 0 var: abc
index: 1 var: abc3
index: 2 var: abc5
['abc2', 'abc4']

删除项时,必须向后移动索引,并且不能在for循环中完成。最好使用while循环,这样可以在删除项目时将索引移回。

使用
with
打开时不需要关闭
f
,使用
with
打开时不需要关闭
f
,我不想让整个列表为空。只需删除已读取的项目。@tmi12您的内部循环正在迭代整个
匹配项\u date[item]
并删除每个元素。我不想使整个列表为空。只需删除已读取的项目。@tmi12您的内部循环正在迭代整个
匹配项\u date[item]
并删除每个元素。