Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

тип Counter() - словарь или множество?

#python #коллекции


В описании типа Counter сказано что он - наследник dict. И не сказано, что он также
и множество. Приведенный ниже код работает и выдает результат:     Counter({'q': 1,
'w': 1})   

from collections import Counter
c1 = Counter({'q':1, "w":2})
c2 = Counter({'q':1, "w":1})
c = c1 & c2
print(c)


Вопрос - почему не описано, что он - множество? Или он "не вполне" множество?
    


Ответы

Ответ 1



Это объект типа Counter (наследник dict) для которого перегружен оператор & (__and__(...)): def __and__(self, other): ''' Intersection is the minimum of corresponding counts. >>> Counter('abbb') & Counter('bcc') Counter({'b': 1}) ''' if not isinstance(other, Counter): return NotImplemented result = Counter() for elem, count in self.items(): other_count = other[elem] newcount = count if count < other_count else other_count if newcount > 0: result[elem] = newcount return result Примеры: In [54]: issubclass(Counter, dict) Out[54]: True In [55]: issubclass(Counter, set) Out[55]: False In [39]: type(c) Out[39]: collections.Counter In [40]: c.items() Out[40]: dict_items([('q', 1), ('w', 1)]) In [41]: type(c.items()) Out[41]: dict_items In [42]: c.keys() Out[42]: dict_keys(['q', 'w'])

Ответ 2



from collections import Counter c1 = Counter({'q':1, "w":2}) print type(c1) # d1={'q':1, "w":2} print type(d1) # Выведем тип переменной d1 isinstance(d1, dict) # является ли переменная d1 переменной класса dict? True issubclass(Counter, dict) # наследуется ли Counter от dict? True issubclass(Counter, set) # наследуется ли Counter от set ? False

Ответ 3



Из документации: The Counter class is similar to bags or multisets in other languages. Counter может быть использован как мультимножество. К примеру: буквы слова образуют мультимножество (буквы могут повторяться). В Питоне, это понятие полезно в задачах, с неупорядоченными списками: Пересечение двух списков с повторениями на Python Сравнение двух списков на нахождение элементов которые соответствуют правилам Counter реализован как подкласс словаря (dict), где ключ это элемент, а значение это количество его повторений. Основное назначение Counter это подсчёт хэшируемых объектов. К примеру: частота слов в тексте. Обычный словарь не определяет +, -, &, | операции. Почему нельзя просто взять и сложить два словаря? Для Counter с положительными счётчиками эти операции позволяют комбинировать мультимножества c очевидной семантикой: +: счётчики складываются -: вычитаются (неположительные счётчики удаляются — соответствуют отсутствующим элементам) &: пересечение содержит элементы из обоих множеств (минимум значений счётчиков) |: слияние — максимум.

Ответ 4



>>> from collections import Counter >>> help(Counter) sh: more: not found Help on class Counter in module collections: class Counter(builtins.dict) | Method resolution order: | Counter | builtins.dict | builtins.object | | Methods defined here: .... help пишет что не наследуется Counter от set.

Комментариев нет:

Отправить комментарий