-5

テキスト内の各単語の頻度をカウントし、各単語をそのカウントと行番号とともに出力する python プログラムを探しています。
単語は、空白以外の文字の連続シーケンスとして定義されます。(ヒント: split())

注: Python と python、I と i など、同じ文字シーケンスの大文字と小文字の違いは同じ単語と見なす必要があります。

入力は、テキストを終了する空の行を含む複数の行になります。入力にはアルファベット文字と空白のみが存在します。

出力は次のようにフォーマットされます。
各行は、単語の頻度を示す数字、空白、単語自体、およびこの単語を含む行番号のリストで始まります。

サンプル入力

Python is a cool language but OCaml
is even cooler since it is purely functional

サンプル出力

3 is 1 2
1 a 1
1 but 1
1 cool 1
1 cooler 2
1 even 2
1 functional 2
1 it 2
1 language 1
1 ocaml 1
1 purely 2
1 python 1
1 since 2

PS。私は学生ではありません。独学で Python を学んでいます。

4

4 に答える 4

5

collections.defaultdictcollections.Counterおよび文字列フォーマットの使用:

from collections import Counter, defaultdict

data = """Python is a cool language but OCaml
is even cooler since it is purely functional"""

result = defaultdict(lambda: [0, []])
for i, l in enumerate(data.splitlines()):
    for k, v in Counter(l.split()).items():
        result[k][0] += v
        result[k][1].append(i+1)

for k, v in result.items():
    print('{1} {0} {2}'.format(k, *v))

出力:

1 以来 [2]
3 は [1, 2] です
1a [1]
1 それ [2]
1 しかし [1]
1 純粋に [2]
1 クーラー [2]
1 機能 [2]
1 ニシキヘビ [1]
1クール [1]
1 言語 [1]
1偶数[2]
1 OCaml [1]

順序が重要な場合は、次の方法で結果を並べ替えることができます。

items = sorted(result.items(), key=lambda t: (-t[1][0], t[0].lower()))
for k, v in items:
    print('{1} {0} {2}'.format(k, *v))

出力:

3 は [1, 2] です
1a [1]
1 しかし [1]
1クール [1]
1 クーラー [2]
1偶数[2]
1 機能 [2]
1 それ [2]
1 言語 [1]
1 OCaml [1]
1 純粋に [2]
1 ニシキヘビ [1]
1 以来 [2]
于 2013-06-07T12:27:08.053 に答える