Питон элегантен! Все это знают – Ну, может быть.
У 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 здесь .