Python 嵌套循环 - table 索引作为变量

Python nested loop - table index as variable

我不是 Python 程序员,但我需要使用 SciPy 库中的一些方法。我只想重复几次内部循环,但更改索引 table。这是我现在的代码:

from scipy.stats import pearsonr

fileName = open('ILPDataset.txt', 'r')
attributeValue, classValue = [], []

for index in range(0, 10, 1):
    for line in fileName.readlines():
        data = line.split(',')
        attributeValue.append(float(data[index]))
        classValue.append(float(data[10]))
    print(index)
    print(pearsonr(attributeValue, classValue))

我得到以下输出:

0
(-0.13735062681256097, 0.0008840631556260505)
1
(-0.13735062681256097, 0.0008840631556260505)
2
(-0.13735062681256097, 0.0008840631556260505)
3
(-0.13735062681256097, 0.0008840631556260505)
4
(-0.13735062681256097, 0.0008840631556260505)
5
(-0.13735062681256097, 0.0008840631556260505)
6
(-0.13735062681256097, 0.0008840631556260505)
7
(-0.13735062681256097, 0.0008840631556260505)
8
(-0.13735062681256097, 0.0008840631556260505)
9
(-0.13735062681256097, 0.0008840631556260505)

如您所见,索引在变化,但该函数的结果始终是索引为 0。

当我 运行 编写脚本几次但索引值发生变化时,如下所示:

attributeValue.append(float(data[0]))
attributeValue.append(float(data[1]))
...
attributeValue.append(float(data[9]))

一切正常,我得到了正确的结果,但我无法在一个循环语句中完成。我做错了什么?

编辑: 测试文件:

62,1,6.8,3,542,116,66,6.4,3.1,0.9,1
40,1,1.9,1,231,16,55,4.3,1.6,0.6,1
63,1,0.9,0.2,194,52,45,6,3.9,1.85,2
34,1,4.1,2,289,875,731,5,2.7,1.1,1
34,1,4.1,2,289,875,731,5,2.7,1.1,1
34,1,6.2,3,240,1680,850,7.2,4,1.2,1
20,1,1.1,0.5,128,20,30,3.9,1.9,0.95,2
84,0,0.7,0.2,188,13,21,6,3.2,1.1,2
57,1,4,1.9,190,45,111,5.2,1.5,0.4,1
52,1,0.9,0.2,156,35,44,4.9,2.9,1.4,1
57,1,1,0.3,187,19,23,5.2,2.9,1.2,2
38,0,2.6,1.2,410,59,57,5.6,3,0.8,2
38,0,2.6,1.2,410,59,57,5.6,3,0.8,2
30,1,1.3,0.4,482,102,80,6.9,3.3,0.9,1
17,0,0.7,0.2,145,18,36,7.2,3.9,1.18,2
46,0,14.2,7.8,374,38,77,4.3,2,0.8,1

9 次脚本运行的 pearsonr 预期结果:

data[0] (0.06050513030608389, 0.8238536636813034)
data[1] (-0.49265895172303803, 0.052525691067199995)
data[2] (-0.5073312383613632, 0.0448647312201305)
data[3] (-0.4852842899321005, 0.056723468068371544)
data[4] (-0.2919584357031029, 0.27254138535817224)
data[5] (-0.41640591455640696, 0.10863082761524119)
data[6] (-0.46954072465442487, 0.0665061785375443)
data[7] (0.08874739193909209, 0.7437895010751641)
data[8] (0.3104260624799073, 0.24193152445774302)
data[9] (0.2943030868699842, 0.26853066217221616)

将文件的每一行变成一个浮点数列表

data = []
with open'ILPDataset.txt') as fileName:
    for line in fileName:
        line = line.strip()
        line = line.split(',')
        line = [float(item) for item in line[:11]]
        data.append(line)

转置数据,使数据中的每个列表都具有原始文件中的列值。 data --> [[column 0 items], [column 1 items],[column 2 items],...]

data = zip(*data)    # for Python 2.7x
#data = list(zip(*data))    # for python 3.x

相关:

for n in [0,1,2,3,4,5,6,7,8,9]:
    corr = pearsonr(data[n], data[10])
    print('data[{}], {}'.format(n, corr))

@wwii 的回答很好

只有一个建议。 list(zip(*data)) 对我来说似乎有点矫枉过正。 zip 确实适用于将具有可变类型和潜在可变长度的列表组合成元组。在这种情况下,只有使用 list()).

才能转换回列表

那么为什么不使用简单的 transpose 操作呢?

import numpy;

//...

data = numpy.transpose(data);

它做同样的工作,可能更快(不是测量)并且更确定。