🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

Q&A

解決済

4回答

1020閲覧

特定の単語の1語後ろの単語を抽出したい

nijihan

総合スコア19

Python

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

0グッド

0クリップ

投稿2019/12/28 04:21

python初心者です。
'I'の後ろの単語を取り出す処理をしたいです。

I am a student. I am seventeen. I can play tennis well.

上のようなテキストファイルを読み込んで、以下の処理をしましたが、無限ループに入ってしまいました。

A = A.readline() A = A.split() while A: a = [] for i in range(len(A)): if A[i] == 'I': a.append(A[I + 1]) A = A.readline()

期待する結果は以下のようなものです。

a = ['am', 'am', 'can']

期待する結果を得るためにどのように変更すべきか教えてください。

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

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

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

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

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

guest

回答4

0

ベストアンサー

with open("sample.txt") as lines: a = [] for line in lines: words = line.split() for i in range(len(words)): if words[i] == 'I': a.append(words[i + 1]) print(a)

投稿2019/12/28 05:12

shiracamus

総合スコア5406

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

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

0

2 つの方法で書いてみました。
1つは 質問文のコードをもとにしています。
もう1つは、ファイル全体を一括で読み込んでから、単語分割して処理していいます。

2つの方法はほとんど同じ結果になりますが、
"I" の次に改行があったときの挙動が異なっています。
1番目の方法では、 ”I" で行が終わっていた時気は、次行の単語を結果に含めることはしていません。
(あくまでも処理は行単位でおこなう)
2番目の方法では、 改行を無視して、"I" の次の単語を結果に含めています。

lines.py

python3

1path = "sample.txt" 2ans = [] 3with open(path) as f: 4 for line in f: 5 words = line.split() 6 for i in range(len(words) - 1): 7 if words[i] == "I": 8 ans.append(words[i + 1]) 9 10print(ans) 11 12with open(path) as f: 13 content = f.read() 14 15words = content.split() 16ans = [words[i + 1] for i in range(len(words) - 1) if words[i] == 'I'] 17print(ans)

sanple.txt

I am a student. I am seventeen. I can play tennis well. A I a A I b I A I c I d

実行例
イメージ説明

投稿2019/12/29 09:32

編集2019/12/29 23:07
katoy

総合スコア22324

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

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

0

既に解決済みですが、参考までに別解をば。

Python

1import re 2 3with open(r'./sample.txt') as fin: 4 src = fin.read() 5 6dst = re.findall(r'\bI\W(\w+)', src) 7print(dst)

実行結果 Wandbox

['am', 'am', 'can']

投稿2019/12/28 09:50

編集2019/12/28 09:59
LouiS0616

総合スコア35668

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

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

0

whileの使い方が間違ってます。
提示のコードを書き換えるとこんな感じかな

python

1with open("text.txt") as f: 2 A = f.read().splitlines() 3 4a = [] 5for word in A: 6 n = word.split() 7 if n[0] == 'I': 8 a.append(n[1]) 9print(a)

先に投稿があった上にそちらの方が適切ですね。
私のは文の途中で'I'が来るケースを見落としてますね。

投稿2019/12/28 05:22

編集2019/12/28 05:25
TaroToyotomi

総合スコア1448

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問