0

文字列から文字の頻度を取得して辞書に保存する関数を作成しようとしています。

私はそのようなことをしました:

s="today the weather was really nice"

def get_letter_freq(s):
    for letter in(s):
        x=letter.split()
    f=dict()
    for each_letter in x:
        if f.has_key(x):
                   f[x]+=1
        else:
                    f[x]=1
print f

私が物事を整理し、私の間違いを見つけるのを手伝ってくれませんか?

'f'が定義されていないというエラーが表示されるのはなぜですか?

4

5 に答える 5

3
  • コードでは、letter.split()ステートメントがある最初のforループは役に立たないようです。なぜあなたは単一のキャラクターを分割したいのですか、あなたはあなたのループに入りますか?
  • 次に、f = dict()関数の内部を定義し、外部で使用しました。外には見えません。
  • 第三に、を使用しないでくださいf.has_keykey in my_dictdictのキーの可用性を確認するために、実行してください。
  • そして最後に、辞書をパラメーターとして関数に渡すことができます。次に、そこで変更し、最後に返します。(関数にを渡さなくても実行できますdictが、そこで新しい関数を作成して返します)。
  • したがって、コードでは、ほとんどすべてが正常です。f = dict()関数を呼び出す前に、関数内の最初のforループを削除し、関数の外に移動する必要があります。そして、それをパラメータとして渡します。

方法1:

だから、あなたはむしろあなたの次の修正されたコードを試すことができます:-

def get_letter_freq(my_dict, s):
    for letter in s:
        if letter in my_dict:
            my_dict[letter] += 1
        else:
            my_dict[letter] = 1

    return my_dict

my_dict = dict()
my_str = "today the weather was really nice"
print get_letter_freq(my_dict, my_str)

方法2:-

Counterまたは、から事前定義されたライブラリ関数を使用することもできます。これにより、必要collectionsな処理が正確に実行されます。


方法3:-

@thebjornコメントで示唆されているようdefaultdictに、を使用することもできます。これにより、タスクが簡単になり、key追加する前に辞書で利用可能かどうかを確認する必要がなくなります。カウントは自動的にデフォルトで0:-

from collections import defaultdict
def get_letter_freq(s):
    my_dict = defaultdict(int)

    for letter in s:
        my_dict[letter] += 1  

    return my_dict

my_str = "today the weather was really nice"
print list(get_letter_freq(my_str).items())
于 2012-11-06T12:02:39.357 に答える
3

そのインデント エラー以外にも、プログラムには次のような多くの問題があります。

s = "today the weather was really nice"

def get_letter_freq(s):
    f = dict()
    for each_letter in s:      #you can directly iterate over a string, so no need of split()
        if each_letter in f:   #has_key() has been deprecated
            f[each_letter]+=1   
        else:
            f[each_letter]=1
    return f                 #better return the output from function

print get_letter_freq(s)

ちなみに、collections.Counter()この目的には適しています:

In [61]: from collections import Counter

In [62]: strs = "today the weather was really nice"

In [63]: Counter(strs)
Out[63]: Counter({' ': 5, 'e': 5, 'a': 4, 't': 3, 'h': 2, 'l': 2, 'r': 2, 'w': 2, 'y': 2, 'c': 1, 'd': 1, 'i': 1, 'o': 1, 'n': 1, 's': 1})
于 2012-11-06T11:59:01.683 に答える
1
  1. fは内部get_letter_freqで定義されているため、外部からアクセスすることはできません。
  2. あなたの関数はreturn構築された辞書でなければなりません。
  3. 実際に関数を呼び出す必要があります。
  4. 1 つの文字を分割することから何を期待しますか? その部分をそのままにしておけば、内側のループは必要ありません。
于 2012-11-06T11:59:26.147 に答える
0
import string
s="today the weather was really nice"
print dict([ ( letter, s.count(letter)) for letter in string.lowercase[:25]])

大文字と小文字の区別が重要な場合は、s.lower().count(letter)代わりに使用してください。

于 2012-11-06T12:36:07.960 に答える
0

print fget_letter_freq の一部にする必要がある場合は、インデントする必要があります。& f は get_letter_freq の外には存在しません。したがって、エラー。

于 2012-11-06T11:59:52.843 に答える