Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
逐行解析文件并以Pythonic方式计算行函数上的最小值_Python - Fatal编程技术网

逐行解析文件并以Pythonic方式计算行函数上的最小值

逐行解析文件并以Pythonic方式计算行函数上的最小值,python,Python,我有一个由行块组成的文件,由表示块结束的特殊行分隔 例如,文件如下所示: 1 5 BLOCK END 13 BLOCK END 3 4 5 BLOCK END 对于每一行,我计算一个值loss(x),并且我想为每个块保存最佳值,即,最后我想要一个列表,为每个块提供函数loss在块的所有值上的最小值 因此,输出等于 [min(f(1),f(5)),f(13),…] 以下代码执行以下操作: best_value = np.inf with open(path) as f: for line

我有一个由行块组成的文件,由表示块结束的特殊行分隔

例如,文件如下所示:

1
5
BLOCK END
13
BLOCK END
3
4
5
BLOCK END
对于每一行,我计算一个值
loss(x)
,并且我想为每个块保存最佳值,即,最后我想要一个列表,为每个块提供函数
loss
在块的所有值上的最小值

因此,输出等于
[min(f(1),f(5)),f(13),…]

以下代码执行以下操作:

best_value = np.inf
with open(path) as f:
    for line in f:
        if line_means_block_ended():
            block_values.append(best_block_value)
            best_value = np.inf
        else:
            best_block_value = min(candidate(line), best_value , key = loss)
print block_values

我觉得这段代码不是最优的,因为初始化为
np.inf
和硬编码的
min
计算。有没有更类似python的方法?

我建议对这个任务进行pyparsing

import pyparsing as pp
创建用于解析文本的词典

# More than one number can appear before block end
number_pattern = pp.OneOrMore(pp.Word(pp.nums))

# Suppressing, so that it doesn't appear in the matches
block_end_pattern = pp.Suppress(pp.Word("BLOCK END"))

# Group the pattern, so that all match appear as a list
pattern = pp.OneOrMore(pp.Group(number_pattern + block_end_pattern))
匹配示例文本

text = """
1
5
BLOCK END
13
BLOCK END
3
4
5
BLOCK END
"""    

matches = pattern.parseString(text)
准备输出

output = []

for val in matches:
    if len(val) > 1:
        # Convert array to the form "f(v)"
        val = ['f(' + v + ')' for v in val]

        # Join the array elements using "," and add "min()"
        output.append("min(" + ",".join(val) + ")")
    else:
        output.append( 'f(' + val[0] + ')')

# Join the final output by ","
block_values = ",".join(output)
输出(块_值):


如果你能发布你的文件样本和该样本所需的输出,我们就能更好地理解你的意图并帮助你更多好的,我添加了一个例子。
min(f(1),f(5)),f(13),min(f(3),f(4),f(5))