Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 27, 2015 23:52:16

12
Зарегистрирован: 2015-09-27
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Словарь. Помогите пожалуйста)

Помогите пожалуйста)
Написать функцию, которая получает на вход слово и возвращает словарь, ключами
которого являются буквы, а значениями ­ количество вхождений каждой из букв.

Отредактировано 12 (Сен. 27, 2015 23:52:41)

Офлайн

#2 Сен. 27, 2015 23:58:42

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Словарь. Помогите пожалуйста)

>>> 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}



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Сен. 28, 2015 08:36:43

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

Словарь. Помогите пожалуйста)

>>> from collections import Counter
>>> Counter('vasya')
Counter({'a': 2, 'y': 1, 's': 1, 'v': 1})

Офлайн

#4 Сен. 28, 2015 19:54:57

Originator
От: Харьков, Украина
Зарегистрирован: 2015-08-01
Сообщения: 29
Репутация: +  1  -
Профиль   Отправить e-mail  

Словарь. Помогите пожалуйста)

Rodegast

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

Особенно применение k:slovo.count(k) в паре с for. Или может подскажете, где почитать подробней. Спасибо.

Офлайн

#5 Сен. 28, 2015 20:21:45

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

Словарь. Помогите пожалуйста)

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. Быстрее.

Офлайн

#6 Сен. 29, 2015 02:55:10

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Словарь. Помогите пожалуйста)

Originator
можно для не сведущих объяснить комбинацию команд.

Особенно применение k:slovo.count(k) в паре с for.
dip3. comprehensions



Отредактировано py.user.next (Сен. 29, 2015 02:55:56)

Офлайн

#7 Сен. 29, 2015 09:42:16

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Словарь. Помогите пожалуйста)

> Интересное решение. Если не затруднительно, можно для не сведущих объяснить комбинацию команд.
Это банальное решение Прочитай про списочные выражения и всё стает понятным.

> но лучше использовать 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)



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#8 Сен. 29, 2015 10:09:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Словарь. Помогите пожалуйста)

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 раз.



Отредактировано py.user.next (Сен. 29, 2015 11:44:29)

Офлайн

#9 Сен. 29, 2015 11:37:24

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

Словарь. Помогите пожалуйста)

Rodegast,py.user.next

Был не прав. Спасибо за пояснение.

Офлайн

#10 Сен. 29, 2015 17:54:43

Originator
От: Харьков, Украина
Зарегистрирован: 2015-08-01
Сообщения: 29
Репутация: +  1  -
Профиль   Отправить e-mail  

Словарь. Помогите пожалуйста)

Джентельмены, спасибо за развернутые ответы с пяснениями и примерами. За себя лично - до классов еще не дошел, списочные выражения …. ну наверное проскочил или не прошел еще. Спасибо еще раз.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version