Счетчик 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» здесь.