Python:如何在多个列表中正确指定位置?

时间:2014-11-09 16:45:11

标签: python if-statement for-loop

我正在编写一个程序,其中所有数据都放在一个大文件中,我需要将它分成几个部分,然后单独处理这些部分。数据分为3个部分,即拍摄当天(或“时代”),波长和光通量。我目前有:

epoch=[]
wavelength=[]
flux=[]

text_file = open("data.dat", "r")
lines1 = text_file.read()
#print lines1
text_file.close()

a = [float(x) for x in lines1.split()]

a1=0
a2=1
a3=2

while a1<len(a):
    epoch.append(int(a[a1]))
    wavelength.append(float(a[a2]))
    flux.append(float(a[a3]))
    a1+=3
    a2+=3
    a3+=3

print epoch

x=[]
y=[]
z=[]

for i in epoch:
    if epoch[i] == epoch[i+1]:
        x.append(epoch[i])
        y.append(wavelength[i])
        z.append(flux[i])
        i+=1
    #print x, y, z

    #else integrate, i+=1

集成是我已经准备好的功能。

当我运行此结果时,结果是3个不同测量数据的最终值的3个列表,例如[1000,1000,1000,1000]而不是[970,980,990,1000]。我想告诉它,如果纪元的值不同,那么在具有相同纪元值的值范围内进行积分,然后再次为下一个纪元值开始处理。

我认为问题在于我没有正确指定列表中的位置,但我不确定如何修复它。

提前致谢。

3 个答案:

答案 0 :(得分:0)

在底部for循环中,您将迭代epoch的值而不是这些值的索引。你可以放一个&#39; print(i)&#39;循环中的语句可以自己查看。这是适当迭代索引的代码:

for i in xrange(len(x)):
    if (i + 1) < len(x) and epoch[i] == epoch[i+1]:
    ...

我修复了另一个错误,在循环的最后一次迭代中,您尝试访问超出列表末尾的索引。这段代码可能还有其他问题 - 这只是第一次通过。

答案 1 :(得分:0)

首先读取数据并列出三元组(时期,波长,通量)。 然后将数据与相同的纪元一起分组。 然后做你想做的事。

import itertools

with open("data.dat", "r") as text_file:
    data = text_file.read()

data = zip(*[(float(z) for z in data)]*3)

for epoch, group in itertools.groupby(data, lambda x:x[0]):
    group = list(group)
    print group

答案 2 :(得分:0)

根据你的描述,听起来你想要一个时代字典,每个条目都包含一个波长/通量值列表。

from collections import defaultdict

data = defaultdict(list)

with open('data.dat') as stream:
    for line in stream:
        entry = line.split()
        data[int(entry[0])].append((float(entry[1]), float(entry[2])))

for epoch, values in data.items():
    y, z = list(zip(*values))
    print('epoch:', epoch)
    print('  wavelength:', y)
    print('  flux:', z)