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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

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

Q&A

解決済

4回答

1337閲覧

テキストファイル1に入っている単語からテキストファイル2に入っている単語の行を抜き出す方法

nanu1129

総合スコア13

Python

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

0グッド

0クリップ

投稿2018/12/22 03:57

やりたいこと

 やりたいことは、テキストファイルが2つあり1つ目のテキストファイルには単語が沢山入っていて、2つ目のテキストファイルには沢山の単語とその後ろにスペース区切りで数字があります。テキストファイル1の単語からテキストファイル2の単語を見つけ、その後ろの数字が何回出てきたのかを数えたいです。

具体例

テキストファイル1
プリン
かぶ
美味しい
ビール
いまいち
マック
けんだま

テキストファイル2
目 3
プリン 4
一万円 5
ポテト 2
ビール 2
カレンダー 5
けんだま 4

この場合に、テキストファイル1からテキストファイル2の単語を探し出し、プリンとビールとけんだまが一致して、その後ろの数字の4が2回、2が1回というように出力をしたいです。

コード

python

1test_data = open("text1.txt", "r") 2mihon_data = open("text2.txt", "r") 3 4 5lines = test_data.readlines() 6kekka = mihon_data.readlines() 7 8 9for line1 in lines: 10 for line2 in kekka: 11 ##何らかの処理 12 13test_data.close() 14mihon_data.close() 15

text1.txtには例のテキストファイル1のようなテキストが入っていて、text2.txtには例のテキストファイル2のようなテキストが入っています。
テキストファイルを開いて2つを1行ずつ読みこみ処理を行えばいいのかと思い、ここまでのコードは書いたのですがわかりません。

よろしければ教えていただけないでしょうか。

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

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

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

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

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

guest

回答4

0

text2.txtの中身をカンマ区切り、数字を半角で作成しています。
又、Windows環境なのでフルパス指定、ファイル読み込みにencoding="utf-8"を入れていますがご了承願います。

text2.txt --- 目,3 プリン,4 一万円,5 ポテト,2 ビール,2 カレンダー,5 けんだま,4 ---

python3

1import os 2# カレントパス 3CurrentDir=os.path.dirname(os.path.abspath(__file__)) + "\" 4 5test_data = open(CurrentDir + "text1.txt", "r",encoding="utf-8") 6mihon_data = open(CurrentDir + "text2.txt", "r",encoding="utf-8") 7 8lines = test_data.readlines() 9kekka = mihon_data.readlines() 10 11count_dict={} # 結果出力辞書 key:検知数値,value:回数 12 13for line1 in lines: 14 line1=line1.replace("\n","") 15 16 for line2 in kekka: 17 line2 = line2.replace("\n","") 18 19 # count_dict辞書になければvalue:1 存在する場合はインクリメント 20 if line1 == line2.split(",")[0]: 21 item_count = line2.split(",")[1] 22 count_dict[str(item_count)] = 1 if item_count not in count_dict else count_dict[str(item_count)] + 1 23 24[(print(key + " が " + str(count_dict[key]) + "回")) for key in count_dict] 25 26test_data.close() 27mihon_data.close()

■結果
4 が 2回
2 が 1回

投稿2018/12/22 05:52

taharasan

総合スコア55

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

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

0

ファイル1をリストに、ファイル2を辞書に読み込めば、あとはCounterで数え上げることができます。
ファイル読込、ファイル2の全角数字を半角に変換などはご自身で実装ください。

Python

1from collections import Counter 2 3words = ['プリン','かぶ','美味しい','ビール','いまいち','マック','けんだま'] 4num_dict = {'目':3,'プリン':4,'一万円':5,'ポテト':2,'ビール':2,'カレンダー':5,'けんだま':4} 5nums = [] 6for word in words: 7 if word in num_dict: 8 nums.append(num_dict[word]) 9 10counter = Counter(nums) 11print(counter) # Counter({4: 2, 2: 1})

投稿2018/12/22 04:18

can110

総合スコア38266

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

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

0

ベストアンサー

まず単語と数字をマップして、それから一行ずつ見ていけば良いのでは。

Python

1from collections import Counter 2 3 4word_to_code = {} 5with open('text2.txt') as fin: 6 for line in map(str.rstrip, fin): 7 k, v = line.split() 8 word_to_code[k] = int(v) 9 10counter = Counter() 11with open('text1.txt') as fin: 12 for line in map(str.rstrip, fin): 13 if line not in word_to_code: 14 continue 15 16 k = word_to_code[line] 17 counter[k] += 1 18 19print(counter)

実行結果 Wandbox

Counter({4: 2, 2: 1})

丸投げな感が否めないので、細かな解説はしません。

投稿2018/12/22 04:08

LouiS0616

総合スコア35660

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

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

nanu1129

2018/12/22 04:21

自分の勉強不足で丸投げになってしまっているのは本当に申し訳なく思います。 にもかかわらず、迅速で的確な回答をありがとうございます。 本当に感謝しています。
LouiS0616

2018/12/22 06:14 編集

低評価を入れた方へ もちろん評価自体は自由にしていただいて構わないのですが、私にはいまいち低評価の原因が掴めません。 回答に不足あるいは間違いがあるならば、コメントで事由を併せてご指摘ください。
guest

0

data_1.txt, data_2.txt data.py で書いてみました。
実行結果

data_1.txt

プリン かぶ 美味しい ビール いまいち マック けんだま

data_2.txt

目 3 プリン 4 一万円 5 ポテト 2 ビール 2 カレンダー 5 けんだま 4

data.py

python3

1from collections import Counter 2 3with open('data_2.txt') as fin: 4 word_to_num = {ary[0] : int(ary[1]) for ary in [line.split() for line in fin.readlines()] if len(ary) == 2} 5 6with open('data_1.txt') as fin: 7 counts = Counter(([word_to_num.get(line.rstrip()) for line in fin.readlines()])) 8 9[print("{0} は {1}回です".format(k, v)) for k, v in counts.items() if k]

投稿2018/12/23 12:04

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問