2013-10-31 44 views
1

我遇到了解析输入文件(示例如下所示)并将信息存储在列表/字典组合中的代码问题。存储列表字典的问题

我有了类似这样的行(他们是棒球统计)一个CSV文件:

Reyes,Jose,Mets,SS,681,191,36,12,12,57,.280 

我能够分裂每个字段并妥善保存它的变量,但现在的问题进入当我必须将数据存储在数据结构中时播放。

我必须存储每个球员的统计数据,然后将球员存储在他们所属的每个球队的字典/列表中。

我的思想过程是与此类似:

DICT OF TEAMS (TEAM IS KEY, VALUE IS A DICT OF PLAYERS) 
| 
V 
DICT OF PLAYERS (THEIR FULL NAME IS KEY, VALUE IS A LIST OF STATS) 
| 
V 
LIST OF STATS (EVERY SINGLE STAT IS IN HERE) 

不幸的是,我的统计名单将填补从整个文本文件(主要是投入列表的文本文件)的信息。我试过在while循环结束时清除表,但它将清单完全清除,即使我将它存储在播放器字典中。

也许有人可以简化我的想法或告诉我我做错了什么。

我的继承人参考代码:

import sys 
from collections import OrderedDict 

if len(sys.argv) == 1: 
    filename = raw_input("No filename supplied. Please enter one now: ") 
    print "Filename supplied. Running now." 
else: 
    print "Filename supplied. Running now." 
    filename = sys.argv[-1] 

#print "\n" 

f = open(filename, "r") 
l = f.readline() 

lastName = ""  #0 
firstName = ""  #1 
teamName = ""  #2 
position = ""  #3 
atBats = ""   #4 
baseHits = ""  #5 
doubles = ""  #6 
triples = ""  #7 
homeruns = ""  #8 
rbi = ""   #9 
batingAvg = ""  #10 

fullName = "" 

teams = {} 
players = {} 
stats = [] 

while l: 
    l = l.strip("\n") 
    curCol = l.split(",") 
    l = f.readline() 

    lastName = curCol[0] 
    firstName = curCol[1] 
    teamName = curCol[2] 
    position = curCol[3] 
    atBats = curCol[4] 
    baseHits = curCol[5] 
    doubles = curCol[6] 
    triples = curCol[7] 
    homeruns = curCol[8] 
    rbi = curCol[9] 
    batingAvg = curCol[10] 

    fullName = firstName + " " + lastName 

    stats.append(lastName) 
    stats.append(firstName) 
    stats.append(teamName) 
    stats.append(position) 
    stats.append(atBats) 
    stats.append(baseHits) 
    stats.append(doubles) 
    stats.append(triples) 
    stats.append(homeruns) 
    stats.append(rbi) 
    stats.append(batingAvg) 

    players[fullName] = stats 

print players 
+0

起飞看看csv模块。 – jramirez

+0

_“他们的全名是关键,值是一个统计列表。”_当两名球员有相同的名字时,你会做什么? – Kevin

+0

@凯文我理解你的观点,但我认为一支球队有两名同名球员的可能性不大。如果他们这样做,那么我们不知道CSV究竟在谈论哪一个。 – sdasdadas

回答

2

我相信你在每次迭代结束时清空您的统计列表。

while l: 
    # ... 
    stats = [] 

编辑:

啊,我明白你的问题。这是因为,当你将列表存储在字典中并清除它时,它也会在字典中清除它。

我相信你可以只作列表的副本在字典存储:

import copy 
# ... 
players[fullName] = copy.deepcopy(stats) 
stats = [] 

编辑2:

另外,我相信你能做到这一点

with open(filename, 'r') as f: 
    for line in f: 
     firstName = line.split(",")[0] 
     lastName = line.split(",")[1] 
     players[firstName + " " + lastName] = line.split(",")[2:] 
+0

当我使用你列出的第二种方法(与deepcopy),我仍然得到同样的错误,如果我打电话 球员['何塞雷耶斯'] – SlashTag

+0

错误意味着你得到所有球员的统计数据,当你查询'何塞雷耶斯' ?您是否在while循环结束时清除了列表? – sdasdadas

+0

这样做!完全忘了那部分。谢谢你的帮助。 – SlashTag