2017-05-28 61 views
0

我正在尝试逐行读取文件并在读取时删除项目。我不知道我在这里做错了什么。在同一天有多个项目,所以我不得不从他们的字典。字典和列表问题

我的脚本:

''' 
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 Esports SK Telecom T1 [0, 1] 

20170510 GIGABYTE Marines Team SoloMid [1, 0] 

20170510 SK Telecom T1 GIGABYTE Marines [1, 0] 

当我想它打印从该文件的每一行(testi_data.csv):

20170510;red;7.8;;;;;G2 Esports;SK Telecom T1;Kennen,Rumble,Karma,Fizz,Shen;LeBlanc,Jayce,Lulu,Fiora,Gangplank;Renekton,Lee Sin,Orianna,Ashe,Zyra;Galio,Graves,Syndra,Varus,Miss Fortune;Expect,Trick,Perkz,Zven,Mithy;Huni,Peanut,Faker,Bang,Wolf (Lee Jae-wan);43:53;71.8k;6;3;0;0;1;86.1k;10;11;5;2;0;2017 Mid-Season Invitational/Main Event/Scoreboards;http://matchhistory.na.leagueoflegends.com/en/#match-details/TRLH1/1002180106?gameHash=6000b59281dff531&tab=overview;International 
20170510;blue;7.8;;;;;Team WE;Flash Wolves;Syndra,LeBlanc,Zyra,Shen,Gragas;Lulu,Karma,Graves,Tahm Kench,Nami;Kled,Elise,Taliyah,Ashe,Bard;Rumble,Lee Sin,Ryze,Varus,Malzahar;957,Condi,Xiye,Mystic,Ben;MMD,Karsa,Maple (Huang Yi-Tang),Betty,SwordArt;29:50;59.7k;16;9;1;1;1;48.1k;13;2;1;0;0;2017 Mid-Season Invitational/Main Event/Scoreboards;http://matchhistory.na.leagueoflegends.com/en/#match-details/TRLH1/1002180124?gameHash=a3c01e30df8a98a8;International 
20170510;blue;7.8;;;;;GIGABYTE Marines;Team SoloMid;Ivern,Galio,Ashe,Caitlyn,Ezreal;Ziggs,Kennen,Syndra,Lee Sin,LeBlanc;Gragas,Kha'Zix,Ahri,Varus,Karma;Nautilus,Graves,Lulu,Twitch,Nami;Stark (Phan Công Minh),Levi,Optimus,Slay,Archie (Trần Minh Nhựt);Hauntzer,Svenskeren,Bjergsen,WildTurtle,Biofrost;36:11;69k;16;11;2;1;0;59.2k;15;4;2;0;0;2017 Mid-Season Invitational/Main Event/Scoreboards;http://matchhistory.na.leagueoflegends.com/en/#match-details/TRLH1/1002180130?gameHash=03336bc5758a759d;International 
20170510;red;7.8;;;;;Flash Wolves;G2 Esports;Jayce,Kennen,Fiora,Renekton,Shen;Ashe,Graves,Lee Sin,Kled,Rumble;Gragas,Rengar,LeBlanc,Varus,Lulu;Nautilus,Ivern,Ryze,Caitlyn,Karma;MMD,Karsa,Maple (Huang Yi-Tang),Betty,SwordArt;Expect,Trick,Perkz,Zven,Mithy;46:27;81.6k;10;6;3;1;0;78.1k;8;8;1;0;0;2017 Mid-Season Invitational/Main Event/Scoreboards;http://matchhistory.na.leagueoflegends.com/en/#match-details/TRLH1/1002180138?gameHash=5604703d17a7f2a4;International 
20170510;blue;7.8;;;;;SK Telecom T1;GIGABYTE Marines;LeBlanc,Gragas,Ziggs,Shen,Fizz;Galio,Kennen,Ezreal,Twitch,Kog'Maw;Rumble,Lee Sin,Ekko,Varus,Lulu;Jayce,Graves,Syndra,Ashe,Karma;Huni,Peanut,Faker,Bang,Wolf (Lee Jae-wan);Stark (Phan Công Minh),Levi,Optimus,Slay,Archie (Trần Minh Nhựt);26:45;58.3k;25;9;3;1;0;43.5k;12;0;0;0;0;2017 Mid-Season Invitational/Main Event/Scoreboards;http://matchhistory.na.leagueoflegends.com/en/#match-details/TRLH1/1002180145?gameHash=2ba736f5ffe8a59c&tab=overview;International 
20170510;blue;7.8;;;;;Team SoloMid;Team WE;LeBlanc,Fizz,Lucian,Kled;Ivern,Varus,Syndra,Ryze,Orianna;Kennen,Lee Sin,Taliyah,Ezreal,Lulu;Jayce,Elise,Karma,Ashe,Nami;Hauntzer,Svenskeren,Bjergsen,WildTurtle,Biofrost;957,Condi,Xiye,Mystic,Ben;39:10;74.3k;10;11;2;2;0;63.5k;6;2;2;0;0;2017 Mid-Season Invitational/Main Event/Scoreboards;http://matchhistory.na.leagueoflegends.com/en/#match-details/TRLH1/1002180154?gameHash=e1b11e4d1901c49b;International 

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

+2

当您使用'with'打开它时,不需要关闭'f' – fafl

回答

1

迭代列表时不要删除项目。它会导致你不会期望的行为。有一个answer解释为什么。由于您的代码将删除所有元素并为matches_date[item]留下空列表,因此您可以简单地将matches_date[item] = []置于内部循环之外。

+0

我不想让整个列表为空。只要删除已阅读的项目。 – tmi12

+0

@ tmi12你的内循环迭代整个'matches_date [item]'并删除每个元素。 – gzc

1

作出答案,因为我想粘贴一个代码示例。

作为@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循环,以便在删除项目时将索引移回。