逐行解析文件并以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))