Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 存储列表的字典时出现问题_Python_List_Dictionary - Fatal编程技术网

Python 存储列表的字典时出现问题

Python 存储列表的字典时出现问题,python,list,dictionary,Python,List,Dictionary,我的代码在解析输入文件(见下面的示例)并将信息存储在列表/字典组合中时遇到问题 我有一个CSV文件,其行与此类似(它们是棒球统计数据): 我现在能够将每个字段拆分并正确地存储在变量中,但当我必须将数据存储在数据结构中时,问题就开始出现了 我必须存储每个球员的统计数据,然后将球员存储在他们所属的每个球队的dict/列表中 我的思考过程与此类似: DICT OF TEAMS (TEAM IS KEY, VALUE IS A DICT OF PLAYERS) | V DICT OF PLAYERS (

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

我有一个CSV文件,其行与此类似(它们是棒球统计数据):

我现在能够将每个字段拆分并正确地存储在变量中,但当我必须将数据存储在数据结构中时,问题就开始出现了

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

我的思考过程与此类似:

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

我相信你必须在每次迭代结束时清除统计列表

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:]

看看csv模块。“他们的全名是关键,值是一个统计列表。”当两名球员同名时,你会怎么做?@Kevin我理解你的观点,但我认为一支球队不太可能有两名球员同名。如果他们这样做了,那么我们就不知道CSV到底在谈论哪一个。当我使用您列出的第二种方法(使用deepcopy)时,如果我调用玩家['Jose Reyes']错误,我仍然会得到相同的错误,这意味着当您查询'Jose Reyes'时,您会得到每个玩家的所有统计信息?你清除了while循环末尾的列表了吗?成功了!完全忘了那部分。谢谢您的帮助。@SlashTag无需担心-如果您愿意,也可以使用
stats[:]
list(stats)
制作列表副本<代码>深度复制仅用于成功复制列表列表或对象列表。如果速度太慢,请查看复制机制以进行优化。
with open(filename, 'r') as f:
    for line in f:
        firstName = line.split(",")[0]
        lastName = line.split(",")[1]
        players[firstName + " " + lastName] = line.split(",")[2:]