То, что вы пытаетесь сделать, можно сделать с помощью dict
, выражения генератора и str.count()
:
abc = dict((c, string.count(c)) for c in string)
Альтернатива с использованием set(string)
(из комментария внизу soulcheck
) :
abc = dict((c, string.count(c)) for c in set(string))
Сроки
При просмотре комментариев внизу я провел небольшое тестирование среди этого и других ответов. (с python-3.2)
Функции тестирования:
@time_me
def test_dict(string, iterations):
"""dict((c, string.count(c)) for c in string)"""
for i in range(iterations):
dict((c, string.count(c)) for c in string)
@time_me
def test_set(string, iterations):
"""dict((c, string.count(c)) for c in set(string))"""
for i in range(iterations):
dict((c, string.count(c)) for c in set(string))
@time_me
def test_counter(string, iterations):
"""Counter(string)"""
for i in range(iterations):
Counter(string)
@time_me
def test_for(string, iterations, d):
"""for loop from cha0site"""
for i in range(iterations):
for c in string:
if c in d:
d[c] += 1
@time_me
def test_default_dict(string, iterations):
"""defaultdict from joaquin"""
for i in range(iterations):
mydict = defaultdict(int)
for mychar in string:
mydict[mychar] += 1
Выполнение теста:
d_ini = dict((c, 0) for c in string.ascii_letters)
words = ['hand', 'marvelous', 'supercalifragilisticexpialidocious']
for word in words:
print('-- {} --'.format(word))
test_dict(word, 100000)
test_set(word, 100000)
test_counter(word, 100000)
test_for(word, 100000, d_ini)
test_default_dict(word, 100000)
print()
print('-- {} --'.format('Pride and Prejudcie - Chapter 3 '))
test_dict(ch, 1000)
test_set(ch, 1000)
test_counter(ch, 1000)
test_for(ch, 1000, d_ini)
test_default_dict(ch, 1000)
Результаты испытаний:
-- hand --
389.091 ms - dict((c, string.count(c)) for c in string)
438.000 ms - dict((c, string.count(c)) for c in set(string))
867.069 ms - Counter(string)
100.204 ms - for loop from cha0site
241.070 ms - defaultdict from joaquin
-- marvelous --
654.826 ms - dict((c, string.count(c)) for c in string)
729.153 ms - dict((c, string.count(c)) for c in set(string))
1253.767 ms - Counter(string)
201.406 ms - for loop from cha0site
460.014 ms - defaultdict from joaquin
-- supercalifragilisticexpialidocious --
1900.594 ms - dict((c, string.count(c)) for c in string)
1104.942 ms - dict((c, string.count(c)) for c in set(string))
2513.745 ms - Counter(string)
703.506 ms - for loop from cha0site
935.503 ms - defaultdict from joaquin
# !!!: Do not compare this last result with the others because is timed
# with 1000 iterations instead of 100000
-- Pride and Prejudcie - Chapter 3 --
155315.108 ms - dict((c, string.count(c)) for c in string)
982.582 ms - dict((c, string.count(c)) for c in set(string))
4371.579 ms - Counter(string)
1609.623 ms - for loop from cha0site
1300.643 ms - defaultdict from joaquin