我正在尝试编写一个脚本来解析一个非常大的数据文件,其中包含有关位置和时间的信息,并将该信息存储在一个数组(即列表列表)中,但是,出于某种原因,我的代码正在编写多个子列表中的相同数字。
# Import data from inputFile into list
with open(r"C:\..file.dat") as inputFile:
inputList = list(inputFile)
totalSegs = 775
totalPrds = 938
stressPrd = 1
segNum = 1
testList = []
masterList = []
while stressPrd <= totalPrds: #build a list of times
testList.append(0)
stressPrd += 1
while segNum <= totalSegs: #build a list of locations
masterList.append(testList) #list of time periods by location
segNum += 1
stressPrd = 1
segNum = 1
for inputItem in inputList: #read data from file and write to lists
if inputItem != '\n'
inputItem = inputItem.split()
if int(inputItem[3]) == int(segNum):
testVar = float(masterList[segNum - 1][stressPrd - 1])
testVar += float(inputItem[6])
masterList[segNum - 1][stressPrd - 1] = testVar
else:
segNum += 1
if segNum <= totalSegs:
testVar = float(masterList[segNum - 1][stressPrd - 1])
testVar += float(inputItem[6])
masterList[segNum - 1][stressPrd - 1] = testVar
else:
segNum = 1
stressPrd += 1
testVar = float(masterList[segNum - 1][stressPrd - 1])
testVar += float(inputItem[6])
masterList[segNum - 1][stressPrd - 1] = testVar
应该发生的是,来自同一时间(stressPrd)的相同位置(segNum)的数据被求和并存储在由stressPrd组织的子列表中,然后segNum存储该时间段内给定位置的列表父列表。然而,正在发生的事情是,脚本会在给定时间内对所有位置的所有数据进行求和(stressPrd),并且该总和存储在每个位置子列表中。
我尝试插入一些打印语句来同时跟踪多个子列表中发生的事情,并且它们都开始同时计算相同的总和。我的变量segNum和stressPrd似乎都正确递增,并且尽可能地告诉我的If语句正确执行,所以我无法找出问题的根源。
作为我想要的结果的一个非常简单的例子:
Data:
Loc Time1 Time2
A 6 1
A 2 2
B 2 3
C 5 4
C 1 1
Result:
[[8,3],[2,3],[6,5]]
提前致谢!
答案 0 :(得分:0)
如果您使用表格数据,我强烈建议您切换到pandas,而不是尝试调试此处发生的特定问题。这是一个非常直接的问题:
In [16]: import pandas as pd
In [17]: from StringIO import StringIO
In [18]: datatable = """Loc Time1 Time2
A 6 1
A 2 2
B 2 3
C 5 4
C 1 1"""
In [19]: df = pd.read_csv(StringIO(datatable), sep=" +", engine="python")
In [20]: df.groupby("Loc").sum()
Out[20]:
Time1 Time2
Loc
A 8 3
B 2 3
C 6 5
如果你想要你指定的特定格式,那么最后也很容易把它拉出来:
In [28]: [list(v[1].values) for v in df.groupby("Loc").sum().iterrows()]
Out[28]: [[8, 3], [2, 3], [6, 5]]