Счетчик Python — часть 2

Это продолжение вступительного поста о python Прилавок инструмент. Если вы хотите прочитать это, прежде чем вернуться к этому, вы можете найти его здесь.

Можем ли мы применить Counter к любой форме данных?

Прилавок — замечательный инструмент, который упрощает задачу подсчета предметов, но нет! он работает только с итерируемыми объектами — это еще не все, так что продолжайте читать. Между тем, что такое итерация? Проще говоря, итерируемый объект хранит последовательность значений или символов, которую вы можете пройти.

Давайте посмотрим на примеры:

>>> a = [1, 2, 3, 4, 5, 6, 7, 3, 3]
>>> b = (1, 2, 3, 4, 5, 6, 7, 2, 2)
>>> c = "This is a string."
>>> m = 123456

а является итерируемым. Это список целых чисел. Вы можете проходить эти числа одно за другим.
б также является итерируемым. Это кортеж, содержащий значения, также одно за другим.
c также является итерируемым. Это последовательность символов.
m не является итерируемым. Это целое число, а не последовательность.

Что происходит, когда мы применяем Прилавок к а, б, в и м?
Во-первых, мы будем импортировать Прилавок из коллекции

>>> from collections import Counter 

Далее будем применять Прилавок к а, ба также с.

>>> Counter(a)
Counter({3: 3, 1: 1, 2: 1, 4: 1, 5: 1, 6: 1, 7: 1})
>>> Counter(b)
Counter({2: 3, 1: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1})
>>> Counter(c)
Counter({'i': 3, 's': 3, ' ': 3, 'T': 1, 'h': 1, 'a': 1, 't': 1, 'r': 1, 'n': 1, 'g': 1, '.': 1})

Как всегда, Прилавок дал нам количество раз, когда каждый элемент встречается в данных итерациях.

За ацелое число 3 встречается три раза, а каждое из остальных чисел встречается только один раз.
За бцелое число 2 встречается три раза, а каждое из остальных чисел встречается только один раз.
Поведение с с Интересно. Счетчик дал нам, сколько раз каждая буква или символ встречались в тексте. я, са также космический персонаж встречается по три раза каждый, а каждый из остальных символов встречается только один раз.

Что происходит с м?

>>> Counter(m)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\DELL\AppData\Local\Programs\Python\Python37-32\lib\collections\__init__.py", line 566, in __init__
    self.update(*args, **kwds)
  File "C:\Users\DELL\AppData\Local\Programs\Python\Python37-32\lib\collections\__init__.py", line 653, in update
    _count_elements(self, iterable)
TypeError: 'int' object is not iterable

гнев-сердитый-раздраженный-987585.jpg

Мы получаем Ошибка типакричать, что м не является итерируемым 😃.
С этим можно смело согласиться: счетчики работают только с итерируемыми объектами.

Можем ли мы осмысленно использовать счетчик с каждым итерируемым объектом?

Посмотрим…

>>> d = {1, 2, 3, 4, 5, 6, 7, 3, 3}
>>> Counter(d)
Counter({1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1})

Это не то, что мы ожидали. Счетчик говорит, что каждое число встречается только один раз, но мы знаем, 3 произошло три раза.

Причина проста. г является набором и не может содержать дубликатов. Несмотря на то, что мы присвоили несколько номеров с 3 встречаясь несколько раз, дубликаты были удалены до того, как они были сохранены в переменной г. Давайте разберем это в коде.

>>> d = {1, 2, 3, 4, 5, 6, 7, 3, 3}
>>>
>>> # what does d contain?
>>> d
{1, 2, 3, 4, 5, 6, 7}
>>>
>>> Counter(d)
Counter({1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1})

Теперь мы можем понять, почему мы получили такой результат. Проблема была в том, что г не было дубликатов, и Прилавок по праву считается только один из каждого числа.
Итак, мы не можем использовать Прилавок осмысленно на наборе, даже если набор является итерируемым.

Давайте посмотрим, что происходит со словарем.

>>> e = {'num1': 1, 'num2':2, 'num3':3, 'num4':3, 'num5':3}
>>> 
>>> # What does e contain?
>>> e
{'num1': 1, 'num2': 2, 'num3': 3, 'num4': 3, 'num5': 3}
>>> Counter(e)
Counter({'num3': 3, 'num4': 3, 'num5': 3, 'num2': 2, 'num1': 1})
>>> 
>>> 
>>>
>>> f = {'str1':'this', 'str2':'that', 'str3':'then', 'str4':'then', 'str5':'that'}
>>> 
>>> # What does f contain?
>>> f
{'str1': 'this', 'str2': 'that', 'str3': 'then', 'str4': 'then', 'str5': 'that'}
>>> Counter(f)
Counter({'str1': 'this', 'str3': 'then', 'str4': 'then', 'str2': 'that', 'str5': 'that'})
>>> 
>>>

Выше у нас есть два словаря, содержащие разные типы значений. Первый, есодержит числа, а второй, фсодержит строки.
Они ведут себя так же, как и Counter; Counter, похоже, не проводил никакого подсчета и возвращал пары ключ-значение в словарях как есть. За исключением изменения порядка — значения отображаются в порядке убывания. Оставим причину для другого поста 😃.

По-видимому, с помощью Прилавок в словаре также не имеет большого значения, если только значения словаря не являются числами. В этом случае ценности рассматриваются как подсчеты ключикак показано с е.

Таким образом, даже если мы можем перемещаться по словарю — я частично считаю его итерируемым — использование словаря не имеет большого смысла. Прилавок в теме. Я упомянул, что словарь является частично итерируемым, потому что вы можете перебирать его ключи, а не значения. Давайте продемонстрируем это:


>>> # mydict is a sample dictionary containing
>>> # information about John Doe
>>> mydict = {'name':'John Doe', 'id':'DST024315', 'age':40, 'country':'Germany'}
>>>
>>> # let's iterate over it
>>> for item in mydict:
...    print(item)
...
name
id
age
country
>>>
>>> # the keys of the dictionary were printed
>>> # instead of the key-value pairs or values

Как мы видели,
а. Счетчики работать только с итерируемыми объектами
б. Использование Прилавок не может быть заметным на всех итерациях.

Мы заметили, что полезно применять Счетчики для списков, кортежей и строк, но не для наборов и словарей, когда мы хотим подсчитать отдельные значения. В качестве примечания, он хорошо работает на следовательно также еще один инструмент, похожий на список но с дополнительными функциями. Вы можете узнать больше об использовании следовательно.

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

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *