【发布时间】: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_mass和current_mass。然后你可以像if current_mass == first_mass/2一样进行比较。
标签: for-loop python-3.x