Форум сайта python.su
0
Помогите пожалуйста)
Написать функцию, которая получает на вход слово и возвращает словарь, ключами
которого являются буквы, а значениями количество вхождений каждой из букв.
Отредактировано 12 (Сен. 27, 2015 23:52:41)
Офлайн
186
>>> slovo = "aaasfvcgh" >>> { k:slovo.count(k) for k in set(list(slovo)) } {'a': 3, 'c': 1, 'g': 1, 'f': 1, 'h': 1, 's': 1, 'v': 1}
Офлайн
35
>>> from collections import Counter
>>> Counter('vasya')
Counter({'a': 2, 'y': 1, 's': 1, 'v': 1})
Офлайн
1
Rodegast
Интересное решение. Если не затруднительно, можно для не сведущих объяснить комбинацию команд.
Особенно применение k:slovo.count(k) в паре с for. Или может подскажете, где почитать подробней. Спасибо.
Офлайн
35
Originator
>>> d = {}
>>> slovo = "aaasfvcgh"
>>> for x in set(slovo):
... d.update({x: slovo.count(x)})
...
>>> print d
{'a': 3, 'c': 1, 'g': 1, 'f': 1, 'h': 1, 'v': 1, 's': 1}Офлайн
857
Originatordip3. comprehensions
можно для не сведущих объяснить комбинацию команд.
Особенно применение k:slovo.count(k) в паре с for.
Отредактировано py.user.next (Сен. 29, 2015 02:55:56)
Офлайн
186
> Интересное решение. Если не затруднительно, можно для не сведущих объяснить комбинацию команд.
Это банальное решение
Прочитай про списочные выражения и всё стает понятным.
> но лучше использовать Counter. Быстрее.
С чего он будет быстрее? Counter это всего лишь переделанный словарь. Вот как он устроен:
class Counter(dict): def __init__(self, iterable=None, **kwds): super(Counter, self).__init__() self.update(iterable, **kwds) def update(self, iterable=None, **kwds): if iterable is not None: if isinstance(iterable, Mapping): if self: self_get = self.get for elem, count in iterable.iteritems(): self[elem] = self_get(elem, 0) + count else: super(Counter, self).update(iterable) else: self_get = self.get for elem in iterable: self[elem] = self_get(elem, 0) + 1 if kwds: self.update(kwds)
Офлайн
857
Counter гораздо медленнее словаря
[guest@localhost ~]$ python3 -mtimeit -s "import collections; s = 'abc' * 100" "collections.Counter(s)"
10000 loops, best of 3: 173 usec per loop
[guest@localhost ~]$
[guest@localhost ~]$ python3 -mtimeit -s "s = 'abc' * 100" "{k: s.count(k) for k in set(s)}"
100000 loops, best of 3: 13.8 usec per loop
[guest@localhost ~]$
Отредактировано py.user.next (Сен. 29, 2015 11:44:29)
Офлайн
35
Rodegast,py.user.next
Был не прав. Спасибо за пояснение.
Офлайн
1
Джентельмены, спасибо за развернутые ответы с пяснениями и примерами. За себя лично - до классов еще не дошел, списочные выражения …. ну наверное проскочил или не прошел еще. Спасибо еще раз.
Офлайн