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

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

В 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 коллекции библиотека. Фонд программного обеспечения Python определяет это таким образом.

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

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

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

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

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

Мы будем импортировать Прилавок чтобы сделать подсчет для нас.

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

Это то, что содержит voices_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)]

наиболее общий() метод Прилавок возвращает список с количеством кортежей в зависимости от числа, которое мы указываем в качестве параметра. Если вам нужны 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» здесь.

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

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

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