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

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

詳細はこちら
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

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

Q&A

2回答

1140閲覧

ファイル入出力プログラムについて

yr28

総合スコア2

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

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

0グッド

1クリップ

投稿2021/02/03 02:45

編集2021/02/04 06:29

Pythonの演習を行っています。
全く分からず、丸投げになってしまうことをお許しください。
回答よろしくお願いいたします。

以下が問題です。
「ファイルalice-wonderland.txtに書かれたテキストを読み、各単語の出現回数を計測し、出現回数が2以上の単語を降順にソートして出力するプログラムを書きなさい。正規表現を扱るreモジュールを使用します。」

以下が出力結果です。
単語の個数 26
単語の降順リスト
[('the', 12), ('in', 8), ('a', 7), ('and', 7), ('to', 6), ('of', 5),
('it', 5), ('tale', 4), ('one', 4), ('with', 3), ('little', 3), ('by', 3), ('we', 2),
('our', 2), ('are', 2), ('while', 2), ('three', 2), ('such', 2), ('beneath', 2),
('fancy', 2), ('land', 2), ('story', 2), ('next', 2), ('time', 2), ('is', 2),
('thus', 2)]

私の作成途中のプログラム(編集しました)です。

Python

1import re 2 3with open('alice-wonderland.txt', 'r', encoding='utf-8') as f: 4 data = f.read() 5  data=data.lower() 6 data=re.sub(r'[^a-z]', ' ', data) 7words={} 8for word in data.split(): 9 words[word]=words.get(word,0)+1 10 11d=[(v,k) for k,v in words.items() if v>=2] 12d.sort() 13d.reverse() 14 15l=0 16for word,count in d: 17 l+=1 18print('単語の個数',l) 19print('単語の降順リスト') 20print(d)

上記のプログラムの出力結果です。

Python

1単語の個数 28 2単語の降順リスト 3[(12, 'the'), (8, 'in'), (7, 'and'), (7, 'a'), (6, 'to'), (5, 'of'), (5, 'it'), (4, 'tale'), (4, 'one'), (3, 'with'), (3, 's'), (3, 'little'), (3, 'by'), (2, 'while'), (2, 'we'), (2, 'time'), (2, 'thus'), (2, 'three'), (2, 'such'), (2, 'story'), (2, 'our'), (2, 'next'), (2, 'land'), (2, 'is'), (2, 'fancy'), (2, 'd'), (2, 'beneath'), (2, 'are')]

ファイルalice-wonderland.txtの内容を以下に記載します。

Python

1All in the golden afternoon 2 Full leisurely we glide; 3 For both our oars, with little skill, 4 By little arms are plied, 5 While little hands make vain pretence 6 Our wanderings to guide. 7 8Ah, cruel Three! In such an hour. 9 Beneath such dreamy weather. 10 To beg a tale of breath too weak 11 To stir the tiniest feather! 12 Yet what can one poor voice avail 13 Against three tongues together? 14 15Imperious Prima flashes forth 16 Her edict "to begin it"17 In gentler tone Secunda hopes 18 "There will he nonsense in it!"19 While Tertia interrupts the tale 20 Not more than once a minute. 21 22Anon, to sudden silence won, 23 In fancy they pursue 24 The dream-child moving through a land 25 Of wonders wild and new, 26 In friendly chat with bird or beast— 27 And half believe it true. 28 29And ever, as the story drained 30 The wells of fancy dry, 31 And faintly strove that weary one 32 To put the subject by, 33 "The rest next time—" "It is next time!" 34 The happy voices cry. 35 36Thus grew the tale of Wonderland: 37 Thus slowly, one by one, 38 Its quaint events were hammered out— 39 And now the tale is done, 40 And home we steer, a merry crew, 41 Beneath the setting' sun. 42 43Alice! a childish story take, 44 And with a gentle hand 45 Lay it where Childhood's dreams are twined 46 In Memory's mystic band, 47 Like pilgrim's wither'd wreath of flowers 48 Pluck'd in a far-off land. 49

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

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

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

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

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

guest

回答2

0

この3つがわからないです。

対象文字列をdataに取り込んでいるので、単語を切り出す前に、dataに対して加工を施せばいいでしょう。

単語の切り出しは一応できていますね。あとは、辞書型オブジェクトに頻度情報を書き加えていく処理を修正するだけだと思います。何か不思議なことをしようとしていますが、単純に+1すればいい話です。

投稿2021/02/04 04:18

編集2021/02/04 04:50
KojiDoi

総合スコア13692

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

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

yr28

2021/02/04 04:32

ありがとうございます。 data=str.lower():ですべての文字を小文字に変換、ということでしょうか? 単純に+1というのはwords[word]=words.get(word,0)+1のことでしょうか? 質問ばかりすみません。
KojiDoi

2021/02/04 04:52

すみません、words.get近辺のコードについては私が読み違えておかしなことを言いました。 未登録のキーについてエラーを回避するためにgetを使っていると思いますが、words.getの結果がNoneであった場合はwords[word]=1 そうでなければwords[word]+=1というふうにすればいいと思います。
yr28

2021/02/04 04:56

ありがとうございます。 分かりました! すみません。小文字に変換するプログラムを詳しく教えていただきたいです。
KojiDoi

2021/02/04 05:04

どの辺が判りませんか? 最初にlowerを使ってdataの中身を一気に小文字にしてしまえばいいだけの話に見えますが。
yr28

2021/02/04 05:23

できました。 ありがとうございます!
yr28

2021/02/04 05:25

度々すみません。 “辞書型オブジェクトに頻度情報を書き加えていく処理を修正する”というところを詳しく教えていただきたいです。
KojiDoi

2021/02/04 05:30

上のコメントで補足したとおりです。
yr28

2021/02/04 06:31

プログラムを編集し、出力結果を出したのですが’s’と’d’が抽出されてしまったことと、wordとcountが反対になってしまいます。 修正箇所を指摘していただけないでしょうか。
guest

0

プログラムを書いたら勉強にならないので、手順だけ書いておきます。(修正しました)

R. ファイルを読み込む。
L. 大文字を小文字に置き換える。
B. 区切り文字等を空白に置き換える。
W. 単語を切り出す。
C. 単語を数える。
S. 単語の数で並び替える。

これらのうちのどれはすぐにできそうですか。
ネットでしらべてできそうなものはどれですか。
自力ではできないと思うものはどれですか。

L. 大文字を小文字に置き換える、はtolowerを知っているので、あとはどこで使うかだけの問題ですね。
また、単語を切り出すのもsplitはわかっているのですね。
では、B. 区切り文字等を空白に置き換える、だけがわかればよいということになります。

置き換えは、re.subを使います。使い方は、以下のようにします。
今回は、小文字以外は全部おきかえることにしました。

python

1>>> import re 2>>> 3>>> data = '''And ever, as the story drained 4... The wells of fancy dry, 5... And faintly strove that weary one 6... To put the subject by, 7... "The rest next time?" "It is next time!" 8... The happy voices cry. 9... ''' 10>>> data 11'And ever, as the story drained\n The wells of fancy dry,\n And faintly strove that weary one\n To put the subject by,\n "The rest next time?" "It is next time!"\n The happy voices cry.\n' 12>>> replaced_data = re.sub(r'[^a-z]', ' ', data) 13>>> print(replaced_data) 14 nd ever as the story drained he wells of fancy dry nd faintly strove that weary one o put the subject by he rest next time t is next time he happy voices cry 15>>> words_list = replaced_data.split() 16>>> print(words_list) 17['nd', 'ever', 'as', 'the', 'story', 'drained', 'he', 'wells', 'of', 'fancy', 'dry', 'nd', 'faintly', 'strove', 'that', 'weary', 'one', 'o', 'put', 'the', 'subject', 'by', 'he', 'rest', 'next', 'time', 't', 'is', 'next', 'time', 'he', 'happy', 'voices', 'cry']

何か変ですね。でも、これを上手に使えばやりたいことはできるはずです。
ヒント:私の質問をよく読み返してください。

完成に近づいてきましたね。

's'と'd'の問題は、手抜きをするなら、辞書の段階で削除するのですが、正規表現の勉強を兼ねて、コードを示します。

python

1>>> import re 2>>> 3>>> data = '''Alice! a childish story take, 4... And with a gentle hand 5... Lay it where Childhood's dreams are twined 6... In Memory's mystic band, 7... Like pilgrim's wither'd wreath of flowers 8... Pluck'd in a far-off land. 9... ''' 10>>> replaced_data = re.sub(r"'s|'d|[^a-z]", ' ', data.lower()) 11>>> print(replaced_data) 12alice a childish story take and with a gentle hand lay it where childhood dreams are twined in memory mystic band like pilgrim wither wreath of flowers pluck in a far off land

正規表現を前回のr'[^a-z]'からr"'s|'d|[^a-z]"に変えました。
"'s"という文字列または、"'d"という文字列または、a-zでない一文字を空白に置き換えるという意味です。
文字列を囲むシングルクォ-トをダブルクォートに変えたのは、シングルクォ-ト自体を含む文字列をシングルクォ-トで囲むためにはエスケープということを行う必要があるからです。正規表現を使うならエスケープは覚えておいたほうが良いので、例を示します。

python

1>>> re.sub(r'\'s|\'d|[^a-z]', ' ', data.lower()) 2'alice a childish story take and with a gentle hand lay it where childhood dreams are twined in memory mystic band like pilgrim wither wreath of flowers pluck in a far off land '

次に、wordとcountが反対という問題です。
印字する前に
d = [(k,v) for v,k in d]
でも良いのですが、sortの勉強として、以下のやり方も覚えておいてください。

python

1>>> d = [('in', 8), ('the', 12), ('a', 7)] 2>>> def second(x): 3... return x[1] 4... 5>>> d.sort(key = second, reverse=True) 6>>> print(d) 7[('the', 12), ('in', 8), ('a', 7)]

keyは、並べ替えるときに使う情報をして指定してます。
('in', 8)が与えられたら、second(('in', 8)) つまり8だと思って並べ替えてくださいという意味です。
reverse=Trueは降順に並べ替えるという意味です。

また、lambda記法というのを使うと、secondという関数を定義しなくてもできますが、これを覚えるのはもっと後になってからで良いでしょう。
書き方だけ示しておきます。

python

1>>> d = [('in', 8), ('the', 12), ('a', 7)] 2>>> d.sort(key = lambda x: x[1], reverse=True) 3>>> print(d) 4[('the', 12), ('in', 8), ('a', 7)]

投稿2021/02/03 02:55

編集2021/02/04 08:40
ppaul

総合スコア24670

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

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

yr28

2021/02/03 03:03

ありがとうございます。 Pythonは授業では学習しておらず、ゼミの課題でPythonを行っております。 正規表現は使わないといけないため、もし可能であれば正規表現を使う方法を教えていただきたいです。 よろしくお願いいたします。
ppaul

2021/02/03 03:19

ピリオドやコンマを外すのを正規表現でやるのかなあ。なくてもできますけどね。
KojiDoi

2021/02/03 06:10

it!"— とか "It とかを纏めて ('it', 5) のようなので、 「単語を切り出す」の前の段階で * アルファベット以外の文字をスペースに置換する * 大文字を小文字に置換する という処理が必要で、ここに正規表現を使う余地がありそうです。
yr28

2021/02/04 04:02 編集

ありがとうございます。 少し作成したプログラムを追記しましたので修正いただきたいです。 L. 大文字を小文字に置き換える。 B. 区切り文字等を空白に置き換える。 W. 単語を切り出す。 この3つがわからないです。 よろしくお願いいたします。
yr28

2021/02/04 06:32

ありがとうございます。 プログラムを編集し、出力結果を示したのですが’s’と’d’が抽出されてしまったことと、wordとcountが反対になってしまいます。 修正箇所を指摘していただけないでしょうか。
yr28

2021/02/04 08:55

ありがとうございます。 細かい説明等も大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問