我有什么应该是一个直接的任务。我有一个非常大的数据文件,我只想从中提取特定数据。我想在开始时做的是读两列,称之为 mass和snapnum ,将 mass 的第一个元素分成两半然后通过列表的其余部分如果找到该数字mass / 2
,则将其附加到新列表以及 snapnum 列表中的相应元素。
我的测试数据如下:
///HEADER
1000 400
100 50
200 300
800 400
50 25
100 300
500 100
400 200
我期待的结果是
500 100
50 25
100 300
400 200
我尝试使用代码
MASS = []
MASS2 = []
SNAPNUM = []
for line in nlines: #Loop Strips empty lines as well as replaces tabs with space
if line !='':
line = line.strip()
line = line.replace('\t',' ')
columns = line.split()
snapnum = columns[1]
mass = float(columns[0])
mass2 = mass/2.;print(mass/2) #divide element in mass by half.
if mass == mass2:
MASS2.append(mass2)
SNAPNUM.append(snapnum)
continue
print(MASS2)
print(SNAPNUM)
我得到的结果
500.0
50.0
100.0
400.0
25.0
50.0
250.0
200.0
[]
[]
似乎没有附加MASS2和SNAPNUM列表。如果我将条件更改为if mass <= mass2
,我会得到附加列表,但结果不是我想要的结果。似乎代码只是循环遍历并且一次性分割整个列表而不是一次分割一个元素。谢谢你的帮助。
答案 0 :(得分:0)
我发现我所需要的只是一个适当循环索引的嵌套循环。
for line in nlines:
if line !='':
line = line.strip()
line = line.replace(',',' ')
columns = line.split()
snapnum = columns[8]
mass = float(columns[6])
MASS.append(mass)
mass2 = mass/2
MASS2.append(mass2)
SNAPNUM.append(snapnum)
for i in range(N):
for j in range(i,N):
if (-0.2)*MASS2[i] <= MASS[j] <= (0.2)*MASS2[i]:
MASS3.append(MASS2[i])
SNAPNUM2.append(SNAPNUM[j])
我只是担心这不是最有效的做事方式。