我有一个名为“test.txt”的文件,其中包含以下值:
a 0.1
b 0.22
c 0.3
d 0.4
我现在想要的是根据值添加一个数字。因此我有以下字典:
dict = {
'0.22':1,
'0.33':7
}
我现在所做的是循环遍历值,看看值是否在行值和下一行中的值之间。如果这是字典中应该推送的值。所以我的预期输出是:
a 0.1
b 0.22 1
c 0.3
d 0.4 7
我已经拥有以下静态工作的代码。但我想改变它,以便它可以遍历字典。
import os
fname = "test.txt"
import os
path = 'C:\Users\Marc\Dropbox\PROJECTEN\Lopend\speak_distinction'
os.chdir(path)
temp_fname = fname + ".tmp"
with open(fname, 'r') as fin, open(temp_fname, 'w') as fout:
for line in fin:
parts = line.split()
#this should be dynamic
if 0 < float(parts[1]) < 0.2:
#this should be dynamic
parts.append("1")
fout.write(' '.join(parts) + '\n')
else:
fout.write(line)
os.remove(fname)
os.rename(temp_fname, fname)
有关我应该在代码中进行哪些调整的想法?
答案 0 :(得分:1)
首先,使用浮点数(或表示浮点数的事件字符串)作为dict
键是不可取的,因为相同的数字可能是不同的表示形式。
相反,我会使用(float_value, int_value)
的元组列表。
data = [(0.22 1), (0.33, 7), ...]
然后排序。它将根据第一个值(float)进行排序。如果两个元组具有相同的值(极不可能),它将使用第二个,等等......
data = sorted(data)
为方便起见,我们还会添加最小数量:
data.insert(0, (float("-inf"), 0))
然后您可以使用bisect来查找此值是否在数字之间:
import bisect
for line in fin:
parts = line.split()
number = float(parts[1])
index = bisect.bisect_left(data, (number,))
if index < len(data) and (data[index-1][0] < number < data[index][0]):
parts.append(str(data[index][1]))
parts.append("\n")
line = ' '.join(parts)
fout.write(line)
bisect.bisect_left(a,x,lo = 0,hi = len(a))
在a中找到x的插入点以维护排序顺序。 [...]
它基本上使我们在数组中的第一个位置高于我们的数字,这正是你所寻找的。 p>