[英]Difference of consecutive float numbers in a column
我在像這樣的列中的文件中有一個浮點數列表:
123.456
234.567
345.678
我如何生成輸出文件,該輸出文件是通過將一行中的值減去剛好在其上方的值而生成的。 對於上面的輸入文件,生成的輸出應為:
123.456-123.456
234.567-123.456
345.678-234.567
第一個值應返回零,而其他值應減去正上方的值。 這不是一個作業問題。 這是我更大的問題的一個很小的要求,而我現在被困在這里。 幫助非常感謝。 謝謝 !!
這將起作用:
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
有一點駭客的感覺。 但是不會在內存中創建巨大的列表。
給定值列表:
[values[i] - values[i-1] if i > 0 else 0.0 for i in range(len(values))]
除了編寫列表推導式表達式或生成器表達式之外,為什么不編寫自己的生成器,它可以具有任意復雜的邏輯並可以輕松地對龐大的數據集進行操作?
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()
最后,這在不可索引的數據源中也很好。 跟蹤索引號以查找值的解決方案在生成器的輸出中效果不佳。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.