嵌套列表系列中的Python数值错误

时间:2015-12-08 18:56:57

标签: python list nested-lists

我正在尝试编写一个脚本来解析一个非常大的数据文件,其中包含有关位置和时间的信息,并将该信息存储在一个数组(即列表列表)中,但是,出于某种原因,我的代码正在编写多个子列表中的相同数字。

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

提前致谢!

1 个答案:

答案 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]]