Pythonで単語の出現頻度をカウントし、重複を除いた単語数を求める方法
単語のリストが与えられたとき、同じ単語が複数回出現することがあります。本記事では、各単語の出現頻度を表示するとともに、重複を除いた単語の種類数をカウントするPythonプログラムを解説します。
問題の概要
例えば、入力が words = ["Book", "Sound", "Language", "Computer", "Book", "Language"] の場合、出力は (4, '2 1 2 1') となります。これは、リストに含まれる異なる単語が4種類であり、そのうち「Book」と「Language」がそれぞれ2回出現しているためです。
解決の手順
- d: 挿入された順序を保持する OrderedDict を作成します
- words 内の各単語 w について以下を繰り返します
- w が d に既に存在する場合は、
d[w] += 1としてカウントを1つ増やします - 存在しない場合は、
d[w] = 1として新規登録します
- w が d に既に存在する場合は、
- 最後に、d のキーの総数(= 異なる単語の種類数)と、d のすべての値を空白区切りで連結した文字列をタプルとして返します
実装例
以下のコードで実際の動作を確認できます。
from collections import OrderedDict
def solve(words):
d = OrderedDict()
for w in words:
if w in d:
d[w] += 1
else:
d[w] = 1
return len(d.keys()), ' '.join([str(d[k]) for k in d.keys()])
words = ["Book", "Sound", "Language", "Computer", "Book", "Language"]
print(solve(words))
入力
["Book", "Sound", "Language", "Computer", "Book", "Language"]
出力
(4, '2 1 2 1')
補足:よりシンプルな代替手段
なお、Python 3.7以降では通常の辞書(dict)も挿入順序を保持するため、OrderedDictを使わずに collections.Counter を利用すれば、さらに簡潔に記述できます。
from collections import Counter
def solve(words):
c = Counter(words)
return len(c), ' '.join(str(v) for v in c.values())
どちらの方法でも、単語の順序を保ちながら出現頻度を正確に集計できます。用途に応じて使い分けるとよいでしょう。
-
Pythonで配列の反転数(転倒数)をカウントする方法
はじめに この記事では、配列内の反転(インバージョン)をカウントする問題とその解決策について詳しく解説します。 問題定義 問題: リストが与えられたとき、その中に含まれる反転の数をカウントして表示します。 反転数とは、配列を昇順にソートされた状態にするために必要な入れ替え(スワップ)の回数を表す指標です。具体的には、i < j かつ arr[i] > arr[j] を満たす要素のペア(i, j)の総数として定義されます。 実装例 # 反転数をカウントする関数 def InvCount(arr, n): inv_count = 0 for i in range(n
-
Pythonで文字列内の単語数を数えるプログラムの書き方【初心者向け】
テキスト処理を行っていると、「入力された文字列の中に単語がいくつ含まれているのか」「特定の単語が何回出現するのか」を調べたい場面によく出会います。この記事では、Pythonを使って文字列内の単語数を数え、その結果を出力する複数の方法を、サンプルコードと実行結果付きでわかりやすく解説します。 基本的な考え方はシンプルです。「単語は空白・改行・タブなどの区切り文字で分けられている」ため、区切り文字の出現回数を数えれば、単語数は「区切り文字の数+1」として求められます。 方法1:forループを使う まずは最も基本的な方法です。文字列を1文字ずつ順番に調べ、区切り文字が見つかるたびにカウントを1