質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
エスケープ処理

エスケープ処理とは、一連の文字や一文字に対して、一定の規則に従って別の意味を適用する処理過程です。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

解決済

3回答

939閲覧

ループ処理を理解したい

smart-material

総合スコア12

エスケープ処理

エスケープ処理とは、一連の文字や一文字に対して、一定の規則に従って別の意味を適用する処理過程です。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2021/10/25 05:53

前提・実現したいこと

eval_loss5つのうち最後の1行で表示される1つしか抽出することができません。

eval_lossだけをすべてを表示させたいです。

表示されるもの
{'eval_loss': 0.6871868968009949, 'eval_matthews_correlation': 0.0, 'eval_runtime': 0.0413, 'eval_samples_per_second': 193.932, 'eval_steps_per_second': 48.483, 'epoch': 1.0}
{'eval_loss': 0.6824596524238586, 'eval_matthews_correlation': 0.0, 'eval_runtime': 0.0388, 'eval_samples_per_second': 206.16, 'eval_steps_per_second': 51.54, 'epoch': 2.0}
{'eval_loss': 0.6821974515914917, 'eval_matthews_correlation': 0.0, 'eval_runtime': 0.0382, 'eval_samples_per_second': 209.559, 'eval_steps_per_second': 52.39, 'epoch': 3.0}
{'eval_loss': 0.6847565174102783, 'eval_matthews_correlation': 0.0, 'eval_runtime': 0.0402, 'eval_samples_per_second': 199.071, 'eval_steps_per_second': 49.768, 'epoch': 4.0}
{'eval_loss': 0.6864501237869263, 'eval_matthews_correlation': 0.0, 'eval_runtime': 0.0391, 'eval_samples_per_second': 204.798, 'eval_steps_per_second': 51.199, 'epoch': 5.0}

下記のソースコードを実行して出力されるもの
イメージ説明

該当のソースコード

import ast with open ('d2.txt')as f: for line in f: di = ast.literal_eval(line) print(di['eval_loss'])

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2021/10/25 06:00

リファレンスや入門サイト等で勉強してみては。
guest

回答3

0

for line in fとあるので、forの中身はfの行数分、実行されます。
そのとき、dt = ast.literal_eval(line)と結果をdtに代入していますが、この行が実行される度にdtに代入しているため、最後の結果しかdtに残りません。

forのイメージはこんな感じです。

python

1xs = ['a', 'b', 'c'] 2for x in xs: 3 di = x 4print(di) 5 6# 以下と同じ 7 8x = xs[0] 9di = x 10x = xs[1] 11di = x 12x = xs[2] 13di = x 14print(di)

そのため、意図した結果を取得するにはforの中にprint()を入れて毎回print()するか、結果を保持する変数を作ってfor内が実行される度にそこに追加していくかする必要があります。

python

1# ① 毎回 print() 2for line in f: 3 di = ast.literal_eval(line) 4 print(di['eval_loss']) # 毎回出力するようにする

python

1# ② 一旦リストに保存 2results = [] 3for line in f: 4 di = ast.literal_eval(line) 5 results.append(di['eval_loss']) 6print(results) # [0.6871868968009949, 0.6824596524238586, ...]

個人的には内包表記をおすすめします(やっていることは上の②のコードと同じで、書き方が違うだけです)。

python

1results = [ast.literal_eval(line) for line in f] 2print(di['eval_loss'] for di in results) 3 4# または 5 6print(ast.literal_eval(line)['eval_loss'] for line in f)

投稿2021/10/25 06:29

fj68

総合スコア752

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Pythonはインデントが意味を持つ言語です。
そのため、ループの範囲はdi = ast.literal_eval(line)だけでありprint文が実行されるのはループから抜けたあとです。
そして、既に値のある変数への代入は変数の上書きになり、以前の値は消えてしまいます。

python

1with open ('d2.txt')as f: 2 for line in f: 3 di = ast.literal_eval(line) 4 print(di['eval_loss'])

をループなしで模式的に書くと、

python

1with open ('d2.txt')as f: 2 di = ast.literal_eval(1行目) 3 di = ast.literal_eval(2行目) 4 di = ast.literal_eval(3行目) 5 di = ast.literal_eval(4行目) 6 di = ast.literal_eval(5行目) 7 print(di['eval_loss'])

となりますので、最後の値だけがprintされます。

python

1with open ('d2.txt')as f: 2 for line in f: 3 di = ast.literal_eval(line) 4 print(di['eval_loss'])

を模式的に書くと

python

1with open ('d2.txt')as f: 2 di = ast.literal_eval(1行目) 3 print(di['eval_loss']) 4 di = ast.literal_eval(2行目) 5 print(di['eval_loss']) 6 di = ast.literal_eval(3行目) 7 print(di['eval_loss']) 8 di = ast.literal_eval(4行目) 9 print(di['eval_loss']) 10 di = ast.literal_eval(5行目) 11 print(di['eval_loss'])

で5行ともprintされます。

投稿2021/10/25 06:21

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

表示だけしたいのか抽出したいのか、元データがどのようなものなのかがよく分かりませんが、
とりあえずprintはループ内に入れると意図した表示にはなるかと思います。
値を抽出したいのであればリストなりに追加しておけばよいかと思います。

Python

1import ast 2 3losses = [] 4for line in ["{'eval_loss':0.1}","{'eval_loss':0.2}"]: 5 di = ast.literal_eval(line) 6 print(di['eval_loss']) 7 losses.append(di['eval_loss']) 8 9print(losses) # [0.1, 0.2]

投稿2021/10/25 06:03

can110

総合スコア38341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問