Найти - Пользователи
Полная версия: Словарь. Помогите пожалуйста)
Начало » Python для новичков » Словарь. Помогите пожалуйста)
1 2
12
Помогите пожалуйста)
Написать функцию, которая получает на вход слово и возвращает словарь, ключами
которого являются буквы, а значениями ­ количество вхождений каждой из букв.
Rodegast
>>> 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}
botinag
>>> from collections import Counter
>>> Counter('vasya')
Counter({'a': 2, 'y': 1, 's': 1, 'v': 1})
Originator
Rodegast

Интересное решение. Если не затруднительно, можно для не сведущих объяснить комбинацию команд.

Особенно применение k:slovo.count(k) в паре с for. Или может подскажете, где почитать подробней. Спасибо.
botinag
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}
но лучше использовать Counter. Быстрее.
py.user.next
Originator
можно для не сведущих объяснить комбинацию команд.

Особенно применение k:slovo.count(k) в паре с for.
dip3. comprehensions
Rodegast
> Интересное решение. Если не затруднительно, можно для не сведущих объяснить комбинацию команд.
Это банальное решение Прочитай про списочные выражения и всё стает понятным.

> но лучше использовать 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)
py.user.next
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 ~]$
Примерно в 13 раз.
botinag
Rodegast,py.user.next

Был не прав. Спасибо за пояснение.
Originator
Джентельмены, спасибо за развернутые ответы с пяснениями и примерами. За себя лично - до классов еще не дошел, списочные выражения …. ну наверное проскочил или не прошел еще. Спасибо еще раз.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB