2017-07-11 13 views
0

私はブロックが終了したことを示す特別な行で区切られた行のブロックで構成されるファイルを持っています。ファイルを1行ずつ解析し、Pythonの方法で行の関数の最小値を計算する

セイ、ファイルは次のようになります。私は値loss(x)を計算し、私は、各ブロックのための最高の値を保存したい、つまり最後に私が与えるリストをしたい各行の

1 
5 
BLOCK END 
13 
BLOCK END 
3 
4 
5 
BLOCK END 

ブロックごとに、ブロックのすべての値に対して最小値の関数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計算、最適ではないと感じ。もっとPythonicな方法がありますか?

+0

ファイルのサンプルとそのサンプルの出力を投稿できる場合、私たちはあなたの意図をよりよく理解してくれます。 –

+0

よろしくお願いします。 – Emolga

答えて

0

私はこの作業のために、細分化をお勧めします。

import pyparsing as pp 

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) 

出力(block_values)を準備したテキスト

# 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)) 

マッチを解析するための辞書を作成します。

min(f(1),f(5)),f(13),min(f(3),f(4),f(5)) 
関連する問題