0

重複の可能性:
Python を使用して各文字の出現回数を取得する方法

文字列内の各文字の数を取得して保存する最良の方法は何ですか (これには辞書を使用しています - この選択は大きな違いを生むことができますか?) 私が考えたいくつかの方法:

1.

for character in string:
    if character in characterCountsDict:
        characterCountsDict[character] += 1
    else:
        characterCountsDict[character] = 1

2.

character = 0
while character < 127:
    characterCountsDict[str(unichr(character))] = string.count(str(unichr(character))
    character += 1

私は2番目の方法が良いと思います...しかし、どちらでも良いですか? これを行うためのはるかに良い方法はありますか?

4

2 に答える 2

10
>>> from collections import Counter
>>> Counter("asdasdff")
Counter({'a': 2, 's': 2, 'd': 2, 'f': 2})

Counterdictのようなオブジェクトを使用できることに注意してください。

于 2012-10-01T13:26:09.447 に答える
2

最も効率的な方法に興味がある場合は、次のようになります。

from collections import defaultdict

def count_chars(s):
    res = defaultdict(int)
    for char in s:
        res[char] += 1
    return res

タイミング:

from collections import Counter, defaultdict

def test_counter(s):
    return Counter(s)

def test_get(s):
    res = {}
    for char in s:
        res[char] = res.get(char, 0) + 1
    return res

def test_in(s):
    res = {}
    for char in s:
        if char in res:
            res[char] += 1
        else:
            res[char] = 1
    return res

def test_defaultdict(s):
    res = defaultdict(int)
    for char in s:
        res[char] += 1
    return res


s = open('/usr/share/dict/words').read()
#eof

import timeit

test = lambda f: timeit.timeit(f + '(s)', setup, number=10)
setup = open(__file__).read().split("#eof")[0]
results = ['%.4f %s' % (test(f), f) for f in dir() if f.startswith('test_')]
print  '\n'.join(sorted(results))

結果:

0.8053 test_defaultdict
1.3628 test_in
1.6773 test_get
2.3877 test_counter
于 2012-10-01T14:51:12.290 に答える