Рубрики
Без рубрики

Счетчик Python – Часть 1

Эта статья содержит введение во встроенный инструмент “Счетчик” Python и является частью серии статей о некоторых часто игнорируемых или неоткрытых встроенных библиотеках python.

Автор оригинала: Victor Ayi.

Питон элегантен! Все это знают – Ну, может быть.

У Python есть все!…Ой! Я знаю, что все не согласятся. Но давайте посмотрим, насколько больше мы сможем впоследствии не согласиться. Пожалуйста, обратите внимание, что весь код-Python 3.

Если бы у нас был список имен, представляющих голоса, как показано ниже, давайте выясним, кто победил.

votes = ['Giggs', 'Giggs', 'Greg', 'Joan', 'Jenny', 'Jenny', 'Jenny', 'Jones']

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

>>> # Lets get a dictionary containing the 
>>> # name of each contestant and their number of votes
>>>
>>> votes_dict = {}
>>>
>>> for contestant in votes:
...	if contestant in votes_dict:
...	    votes_dict[contestant] += 1
...	else:
...	    votes_dict[contestant] = 1
...
...

Наш словарь голосов должен выглядеть следующим образом:

{'Giggs': 2, 'Greg': 1, 'Joan': 1, 'Jenny': 3, 'Jones': 1}

Теперь мы можем определить победителя, выяснив участника с наибольшим количеством голосов. Мы отсортируем список участников и их количество голосов.

>>> # sort contestants by their votes in descending order, 
>>> # into "contestant name, number of votes" tuples
>>>
>>> contestants_sorted = sorted(
...    votes_dict.items(), 
...    key=lambda contestant: contestant[1], 
...    reverse = True
... )

Наш список кортежей “имя участника, количество голосов”, в порядке от лучших голосов до наименьших голосов, должен выглядеть следующим образом:

[('Jenny', 3), ('Giggs', 2), ('Greg', 1), ('Joan', 1), ('Jones', 1)]

Очевидно, Дженни выиграла. Итак, давайте покажем это программно.

>>> # Let's pick the name of the winner, and number of votes.
>>> # Obviously that is in the first tuple.
>>> # Then let's display them.
>>>
>>> winner, top_votes = contestants_sorted[0]
>>> print('{} won with {} votes.'.format(winner, top_votes))

Наконец, победитель должен отображаться следующим образом:

 Jenny won with 3 votes.

Более простой способ…

Может ли быть более элегантный и простой способ сделать это?

Это подводит нас к нашему первому скрытому инструменту под названием Счетчик . Это часть встроенной библиотеки python collections . Программный фонд Python определяет его таким образом.

Счетчик-это подкласс dict для подсчета хэшируемых объектов. Это коллекция, в которой элементы хранятся в виде ключей словаря, а их количество хранится в виде значений словаря. Счетчики могут иметь любое целочисленное значение, включая нулевые или отрицательные значения. Класс счетчика похож на пакеты или мультисеты в других языках.

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

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

Еще раз, ниже приведен наш список голосов:

>>> votes = ['Giggs', 'Giggs', 'Greg', 'Joan', 'Jenny', 'Jenny', 'Jenny', 'Jones']

Мы импортируем Счетчик , чтобы сделать подсчет за нас.

>>> from collections import Counter
>>>
>>> # let Counter count the votes
>>> votes_counter = Counter(votes)

Это то, что содержит votes_counter; Каждый участник и их количество голосов.

Counter({'Jenny': 3, 'Giggs': 2, 'Greg': 1, 'Joan': 1, 'Jones': 1})

Ясно, что Дженни победила, и мы на верном пути. Давайте узнаем информацию о победителе

>>> #get winner using Counter's most_common() method.
>>> top_contestant_info = votes_counter.most_common(1)

Теперь наш top_contestant_info будет содержать это:

[('Jenny', 3)]

Метод most_common() метода Counter возвращает список с количеством кортежей в зависимости от числа, указанного в качестве параметра. Если вам нужны 3 лучших участника, most_common(3) вернет список из трех кортежей, представляющих три самых верхних элемента.

Для этой иллюстрации нам нужен был только лучший участник, и поэтому мы указали 1. Мы предполагаем и знаем, что никакой связи не было. Однако в реальном мире нам пришлось бы добавить дополнительный код для работы со связями, но это зарезервировано для более продвинутой должности.

Теперь давайте покажем победителя по-человечески

>>> # let's get winner and winner votes
>>> # and display them
>>>
>>> winner, top_votes = top_contestant_info[0]
>>> print('{} won with {} votes.'.format(winner, top_votes))

А вот и наш победитель:

Jenny won with 3 votes.

Счетчик не мог бы сделать жизнь проще!!!

Краткое изложение двух подходов:

Вот список избирателей:

>>> votes = [
...    'Giggs', 'Giggs', 'Greg', 
...	   'Joan', 'Jenny', 'Jenny', 
...	   'Jenny', 'Jones'
... ]
...
...

Подход 1.

>>> votes_dict = {}
>>>
>>> for contestant in votes:
...	if contestant in votes_dict:
...	    votes_dict[contestant] += 1
...	else:
...	    votes_dict[contestant] = 1
...
...
>>> contestants_sorted = sorted(
...     votes_dict.items(), 
...     key=lambda contestant: contestant[1], 
...     reverse = True
... )
...
...
>>> winner, top_votes = contestants_sorted[0]
>>> print('{} won with {} votes.'.format(winner, top_votes))
Jenny won with 3 votes.

Подход 2 – Использование счетчика

>>> from collections import Counter
>>>
>>> top_contestant_info = Counter(votes).most_common(1)
>>>
>>> winner, top_votes = top_contestant_info[0]
>>> print('{} won with {} votes.'.format(winner, top_votes))
Jenny won with 3 votes.

Итак, поехали! Выберите между Счетчиком и другим способом…. Если вы выберете Счетчик способ, сделайте все возможное, чтобы прочитать больше из Python Software Foundation здесь . Вы также можете прочитать Счетчик Python – Часть 2 здесь .