我在列中的文件中有一个浮点数列表,如下所示:
123.456
234.567
345.678
如何生成一个输出文件,该文件是通过在其上方的值中减去一行中的值来生成的。对于上面的输入文件,生成的输出应为:
123.456-123.456
234.567-123.456
345.678-234.567
第一个值应该返回零,但其他值应该用它上面的值减去。这不是一个功课问题。这是我更大问题的一个小要求,我在这一点上陷入困境。非常感谢。谢谢 !!
答案 0 :(得分:2)
这将有效:
diffs = [0] + [j - data[i] for i,j in enumerate(data[1:])]
因此,假设data.txt
包含:
123.456
234.567
345.678
然后
with open('data.txt') as f:
data = f.readlines()
diffs = [0] + [float(j) - float(data[i]) for i,j in enumerate(data[1:])]
print diffs
将产生
[0, 111.111, 111.11099999999999]
此答案假设您希望保留计算值以供进一步处理。
如果您想在某个时刻将这些内容逐行写入文件:
with open('result.txt', 'w') as outf:
for i in diffs:
outf.write('{0:12.5f}\n'.format(i))
并调整字段宽度以满足您的需要(现在保留12个空格,小数点后5个),写出文件result.txt
。
更新:鉴于(来自下面的评论)内存中可能存在太多数据,此解决方案应该可行。 Python 2.6不允许在同一with
中打开这两个文件,因此单独的语句。
with open('result2.txt', 'w') as outf:
outf.write('{0:12.5f}\n'.format(0.0))
prev_item = 0;
with open('data.txt') as inf:
for i, item in enumerate(inf):
item = float(item.strip())
val = item - prev_item
if i > 0:
outf.write('{0:12.5f}\n'.format(val))
prev_item = item
有一点黑客的感觉。但是不会在内存中创建一个巨大的列表。
答案 1 :(得分:2)
给出一系列值:
[values[i] - values[i-1] if i > 0 else 0.0 for i in range(len(values))]
答案 2 :(得分:2)
为什么不编写自己的生成器来代替列表推导或生成器表达式,这些生成器可以具有任意复杂的逻辑并且可以轻松地操作大量数据集?
from itertools import imap
def differences(values):
yield 0 # The initial 0 you wanted
iterator = imap(float, values)
last = iterator.next()
for value in iterator:
yield value - last
last = value
with open('data.txt') as f:
data = f.readlines()
with open('outfile.txt', 'w') as f:
for value in differences(data):
f.write('%s\n' % value)
如果data
只包含几个值,那么好处就不一定如此清晰(尽管明年你必须回来维护它时代码本身的明确性可能会很好)。但是假设data
是来自巨大(或无限!)源的值的流,并且您想要处理它的前1000个值:
diffs = differences(enormousdataset)
for count in xrange(1000):
print diffs.next()
最后,这适用于不可索引的数据源。跟踪索引号以查找值的解决方案与生成器的输出不匹配。