在字典中循环以在文本中放置值

2024-05-08 02:47:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件叫做:“测试.txt“具有以下值:

a 0.1 
b 0.22
c 0.3
d 0.4

我现在要做的是根据值添加一个数字。因此,我有以下词典:

dict = {
'0.22':1,
'0.33':7 
}

我现在要做的是遍历这些值,看看值在rowvalue和下一行中的值之间。如果这是字典中的值,则应该推送它。所以我的预期结果是:

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)

对我应该在代码中做什么调整有什么想法吗?你知道吗


Tags: path代码importtxt字典osasline
1条回答
网友
1楼 · 发布于 2024-05-08 02:47:17

首先,使用float(或表示float的事件字符串)作为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))

Locate the insertion point for x in a to maintain sorted order. [...]

它基本上给了我们在数组中的第一个位置,这个位置比我们的数字要高,这正是你想要的。你知道吗

相关问题 更多 >