2

免責事項: Python の学習を始めたばかりです。

単語がテキストファイルに出現する回数をカウントし、その単語をキー、カウントを値として設定し、辞書「book_index」に格納する関数があります。これが私のコードです:

alice = open('location of the file', 'r', encoding = "cp1252")

def book_index(alice):
    """Alice is a file reference"""
    """Alice is opened, nothing else is done"""
    worddict = {}
    line = 0

    for ln in alice:
        words = ln.split()
        for wd in words:
            if wd not in worddict:
                worddict[wd] = 1 #if wd is not in worddict, increase the count for that word to 1
            else:
                worddict[wd] = worddict[wd] + 1 #if wd IS in worddict, increase the count for that word BY 1
        line = line + 1
    return(worddict)

その辞書を「裏返し」にして、カウントをキーとして使用し、x 回出現する単語を値として使用する必要があります。例: [2, 'hello', 'hi'] テキスト ファイルに 'hello' と 'hi' が 2 回表示されます。

既存の辞書をループする必要がありますか、それともテキスト ファイルを再度ループする必要がありますか?

4

4 に答える 4

3

個人的には、この種のアプリケーション用に特別に作成された Counter オブジェクトをここで使用することをお勧めします。例えば:

from collections import Counter
counter = Counter()
for ln in alice:
    counter.update(ln.split())

これにより、関連する辞書が表示されます。次に、Counter ドキュメントを読むと、

最も一般的な結果を取得できます。

これは、提案された問題のすべてのケースでうまくいくとは限りませんが、最初から手動で反復するよりも少しはうまくいきます。

この辞書を本当に「反転」させたい場合は、次の行に沿って何かを行うことができます。

matching_values = lambda value: (word for word, freq in wordict.items() if freq==value)
{value: matching_values for value in set(worddict.values())}

上記のソリューションには、他のソリューションよりもいくつかの利点があります。遅延実行は、この関数をあまり呼び出さない、または実際に対応するエントリを持つ値を見つけるだけの非常にまばらなケースでは、これがより高速になることを意味します。実際には辞書を反復処理しないためです。

とは言っても、このソリューションは、新しい数値が必要になるたびに辞書をアクティブに反復するため、通常、通常の反復ソリューションよりも悪くなります。

根本的に違うわけではありませんが、ここで他の回答をコピーしたくありませんでした。

于 2013-11-13T19:28:17.953 に答える
2

既存の辞書をループします。これを使用した例を次に示しますdict.setdefault()

countdict = {}
for k, v in worddict.items():
    countdict.setdefault(v, []).append(k)

またはcollections.defaultdict

import collections
countdict = collections.defaultdict(list)
for k, v in worddict.items():
    countdict[v].append(k)

setdefault()結果が通常の辞書になるため、個人的にはこの方法を好みます。

例:

>>> worddict = {"hello": 2, "hi": 2, "world": 4}
>>> countdict = {}
>>> for k, v in worddict.items():
...     countdict.setdefault(v, []).append(k)
...
>>> countdict
{2: ['hi', 'hello'], 4: ['world']}

book_index他のいくつかの回答で述べたように、を使用して関数を大幅に短縮できますcollections.Counter

于 2013-11-13T19:27:44.437 に答える
1

重複なし:

word_by_count_dict = {value: key for key, value in worddict.iteritems()}

Python での辞書理解については、PEP 274 を参照してください: http://www.python.org/dev/peps/pep-0274/

重複あり:

import collections

words_by_count_dict = collections.defaultdict(list)
for key, value in worddict.iteritems():
    words_by_count_dict[value].append(key)

こちらです:

words_by_count_dict[2] = ["hello", "hi"]
于 2013-11-13T19:36:19.993 に答える