在对单独列表的每个元素执行操作后构建列表

时间:2014-11-10 18:36:47

标签: for-loop python-3.x

我有什么应该是一个直接的任务。我有一个非常大的数据文件,我只想从中提取特定数据。我想在开始时做的是读两列,称之为 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,我会得到附加列表,但结果不是我想要的结果。似乎代码只是循环遍历并且一次性分割整个列表而不是一次分割一个元素。谢谢你的帮助。

1 个答案:

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

我只是担心这不是最有效的做事方式。