【问题标题】:Building a list after preforming an operation on each element of a sepatate list在对单独列表的每个元素执行操作后构建列表
【发布时间】:2014-11-10 18:36:47
【问题描述】:

我有一项应该是直截了当的任务。我有一个非常大的数据文件,我只想从中提取特定数据。一开始我想做的是读两列,称它们为 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,我会得到附加列表,但结果不是我想要的。看起来好像代码只是循环并一次将整个列表划分,而不是一次划分一个元素。感谢您的帮助。

【问题讨论】:

  • if mass == mass2 实际上等同于if mass == mass/2.0。因此,您的列表为空对我来说并不奇怪。因为 500 不等于 250,50 不等于 25,100 不等于 50……等等。
  • 另外,这是你的实际缩进吗? for line in nlines: 之前有一个空格,if line !='': 之前有 0 个空格?看起来应该会因IndentationError 而崩溃。
  • 在复制和粘贴时缩进被丢掉了。
  • @Kevin,我想要的是在 mass/2 == mass 时附加它,我是否应该只写一个单独的列表,将 mass/2 与原始列表进行比较?我将使用的真实数据集非常大,我担心内存问题。
  • 所以你想在质量为零时追加?这是唯一等于自身除以二的数字。或者当您说“质量”时,您是否试图指代两种不同的事物?像“当前行的质量”和“第一行的质量”之类的?如果是这样,你应该给他们单独的名字,比如first_masscurrent_mass。然后你可以像if current_mass == first_mass/2一样进行比较。

标签: for-loop python-3.x


【解决方案1】:

我发现我需要的只是一个正确索引的嵌套循环 for 循环。

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

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

【讨论】:

    猜你喜欢
    • 2011-10-30
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多