#動機
以前の投稿で、改行区切りのテキストファイルを読み込んでリストにした際、各要素に改行記号が含まれてしまったので、それを削除したかった。
#map関数でリストの各要素を処理
こちらのブログ記事を参考にさせていただきました。
map(処理,リストオブジェクト)とすることで、各要素に処理を適用できるんですね。
ついfor文を回してしまいそうになります。
動機にあるリンクの以前の投稿に乗せたスクリプトの改良版です。
contain_or_not.py
import sys
r0 = open('vocab.txt','r') #読み込みモードでファイルを開く
vocab = r0.readlines() #vocab.txtには改行区切りで単語が入っている
r0.close()
argvs = sys.argv
words = argvs[1:] #argvs[0]は実行時のファイル名が入っている
def remove(s):
return s.replace('\n','') #replace('置換前','置換後')該当する文字列を置換する
new_vocab = list(map(remove, vocab)) #map関数でvocabの各要素の改行文字を削除
for word in words:
if word in new_vocab:
print(word + ' is in vocab at line %d.' %(new_vocab.index(word)+1))
else:
print(word + ' is not in vocab.')
ついでに、確かめたい単語がリストの何行目にあるかも出力されるようにしました。
#イテレータってなんだろう
はじめ何も考えずにmap関数を用いたら、new_vocabがmapオブジェクトになってしまったので、list関数を使って再度リスト化しました。
mapオブジェクトはイテレータと呼ばれるらしい。for文を書く代わりに、リストの各要素に対して同じ処理を施してくれる機能を持ったオブジェクトということなのでしょうか。まだまだ理解が浅い。