列中连续浮点数的差异

时间:2012-06-05 16:28:21

标签: python

我在列中的文件中有一个浮点数列表,如下所示:

123.456

234.567

345.678

如何生成一个输出文件,该文件是通过在其上方的值中减去一行中的值来生成的。对于上面的输入文件,生成的输出应为:

123.456-123.456

234.567-123.456

345.678-234.567

第一个值应该返回零,但其他值应该用它上面的值减去。这不是一个功课问题。这是我更大问题的一个小要求,我在这一点上陷入困​​境。非常感谢。谢谢 !!

3 个答案:

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

最后,这适用于不可索引的数据源。跟踪索引号以查找值的解决方案与生成器的输出不匹配。