ホームページ >バックエンド開発 >Python チュートリアル >Pythonで単語数をカウントする考え方を詳しく解説
この記事では主に Python で単語数をカウントする詳細なアイデアを紹介します。また、興味のある方は一緒に見てください
問題の説明:
Python を使用する関数 count_words() を実装します。この関数は文字列 s と数値 n を受け取り、s 内で最も頻繁に出現する n 個の単語を返します。戻り値は、最も出現頻度の高い n 個の単語とその回数を含むタプルのリストです。つまり、[(
すべての入力は小文字であり、句読点やその他の文字は含まれていない (文字と 1 つのスペースのみ) と想定できます。同じ数の出現がある場合は、アルファベット順に並べられます。
例:
print count_words("betty bought a bit of butter but the butter was bitter",3)
出力:
[('butter', 2), ('a', 1), ('betty', 1)]
解決するアイデア問題:
1. 文字列 s を空白で分割して、すべての単語リストを取得します。例: ['betty'、'bought'、'a'、'bit'、'of'、'butter'、 ' but', 'the', 'butter', 'was', 'bitter']
2. マップリストを作成し、split_s を次のようなタプルのリストに変換します: [('betty', 1), ( '買った', 1), ('a', 1), ('bit', 1), ('of', 1), ('butter', 1), ('but', 1), ('the ' , 1), ('butter', 1), ('was', 1), ('bitter', 1)]
3. タプルの最初のインデックス値が同じ場合、マップリスト内の要素をマージします。 、その後、その 2 番目のインデックス値が追加されます。
// 注:defaultdict を使用する準備をします。取得したデータは次のとおりです: {'betty': 1, 'bought': 1, 'a': 1, 'bit': 1, 'of': 1, 'butter': 2, 'but': 1, 'the ': 1, 'was': 1, 'bitter': 1}
4. キーでアルファベット順に並べ替えると、次のようになります: [('a', 1), ('betty', 1), ( 'ビット', 1), ('苦い', 1), ('買った', 1), ('しかし', 1), ('バター', 2), ('の', 1), ('ザ ' , 1), ('was', 1)]
5. 二次ソートを実行し、値でソートし、次を取得します: [('butter', 2), ('a', 1), ('betty ' 、1)、('ビット'、1)、('苦い'、1)、('買った'、1)、('しかし'、1)、('の'、1)、('その'、1 ), ('was', 1)]
6. スライスを使用して * より高い頻度でデータのグループを抽出します
概要:defaultdict を使用しない並べ替え結果も python3 では正しいですが、python2 では正しくありません。 defaultdict 自体には順序がありません。リストを区別するには、ソートする必要があります。
サードパーティのモジュールを使用せずに自分で作成してみることもできます
解決策 1 (defaultdict を使用):
from collections import defaultdict """Count words.""" def count_words(s, n): """Return the n most frequently occuring words in s.""" split_s = s.split() map_list = [(k,1) for k in split_s] output = defaultdict(int) for d in map_list: output[d[0]] += d[1] output1 = dict(output) top_n = sorted(output1.items(), key=lambda pair:pair[0], reverse=False) top_n = sorted(top_n, key=lambda pair:pair[1], reverse=True) return top_n[:n] def test_run(): """Test count_words() with some inputs.""" print(count_words("cat bat mat cat bat cat", 3)) print(count_words("betty bought a bit of butter but the butter was bitter", 4)) if __name__ == '__main__': test_run()
解決策 2 (Counter を使用)
from collections import Counter """Count words.""" def count_words(s, n): """Return the n most frequently occuring words in s.""" split_s = s.split() split_s = Counter(name for name in split_s) print(split_s) top_n = sorted(split_s.items(), key=lambda pair:pair[0], reverse=False) print(top_n) top_n = sorted(top_n, key=lambda pair:pair[1], reverse=True) print(top_n) return top_n[:n] def test_run(): """Test count_words() with some inputs.""" print(count_words("cat bat mat cat bat cat", 3)) print(count_words("betty bought a bit of butter but the butter was bitter", 4)) if __name__ == '__main__': test_run()
関連する推奨事項:
以上がPythonで単語数をカウントする考え方を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。