7 практических трюков в Python
Нет никаких сомнений, что Python можно назвать языком, испытавшим в последнее десятилетие значительный рост. Языком, который постоянно доказывает свою мощь.
Мы создали множество Python-приложений – от чат-ботов в Telegram до блокчейнов и небольших игр. Поистине Python обладает огромным количеством возможностей, и если вы только начали работать с ним, то сходу бывает сложно всё это ухватить.
Хотя, даже если вы программист, который переходит на Python с другого языка, или если вы учёный, который раньше работал с MATLAB, программирование на Python с использованием высокоуровневых абстракций – это совершенно новый для вас опыт.
Сегодня Python Academy расскажет о нескольких очень важных возможностях Python.
Большинство примеров будут работать только в третьей версии Python.
1. Сортировка словаря по значениям
Распространена практика использования словарей в качестве таблиц для хранения данных. Сортировка данных словаря по значениям ключей, а не самим ключам, нередко ставит в тупик. Задача решается довольно просто при помощи аргумента key
для указания функции, которая будет вызываться на каждом элементе до сравнения:
>>> d = {'яблоки': 40, 'апельсины': 80, 'бананы': 70} >>> sorted(d, key=d.get) ['яблоки', 'бананы', 'апельсины']
2. Нахождение наиболее частых элементов списка
Если необходимо найти несколько наиболее часто повторяющихся значений, лучше воспользоваться счетчиком Counter
из библиотеки collections
:
>>> from collections import Counter >>> a = ['a', 'b', 'c', 'a', 'b', 'c', 'b', 'b', 'd', 'e', 'a'] >>> cnt = Counter(a) >>> cnt.most_common(3) [('b', 4), ('a', 3), ('c', 2)]
Метод Counter.most_common(x)
возвращает x
кортежей, в которых первое значение – элемент, а второе – количество его повторений.
3. Объединение списков без цикла
Как бы вы решили задачу объединения списков разной длины без обхода элементов цикла? Вот как это можно сделать с помощью стандартной функции sum
, указав вторым аргументом пустой список, к которому будут прибавляться остальные подсписки:
>>> L = [[1, 2, 3], [4, 5], [6], [7, 8, 9]] >>> sum(L, []) [1, 2, 3, 4, 5, 6, 7, 8, 9]
Другой, пусть и менее краткий, но более эффективный способ – это применение модуля itertools
:
import itertools L = [[1, 2, 3], [4, 5], [6], [7, 8, 9]] >>>list(itertools.chain.from_iterable(L)) [1, 2, 3, 4, 5, 6, 7, 8, 9]
Кстати, при работе с последовательностями многие полезные решения находятся в модулях стандартной библиотеки collections и itertools.
4. Удаление дубликатов в списке с сохранением порядка
Среди регулярно используемых трюков в Python – использование множества для удаления повторяющихся элементов в списке:
>>> items = [2, 2, 3, 3, 1] >>> list(set(items)) [1, 2, 3]
Но множества – это неупорядоченные последовательности.
Часто необходимо сохранить порядок следования элементов. Для этого можно воспользоваться типом данных collections.OrderedDict
, который похож на обычный словарь, но порядок, в котором ему были даны ключи. Итак, сделаем упорядоченный словарь, а дальше просто возьмем его ключи:
from collections import OrderedDict items = [2, 2, 3, 3, 1] >>> d = OrderedDict.fromkeys(items) >>> list(d.keys()) [2, 3, 1]
5. Объединение строк
Нередко программисту приходится сталкиваться с конкатенацией строк при помощи знака сложения. Создание строки из списка нескольких подстрок удобнее осуществить при помощи строкового метода join
:
>>> a = ["Python", "-", "прекрасный", "язык."] >>> " ".join(a) 'Python - прекрасный язык.'
Вот пример посложнее – конвертирование списка чисел в строку:
>>> numbers = [1, 2, 3, 4, 5] >>> ', '.join(map(str, numbers)) '1, 2, 3, 4, 5'
Не забывайте, что метод join
работает быстрее чем цикл.
6. Функция zip
Функция zip
создаёт итератор, который комбинирует элементы нескольких списков. Это позволяет осуществлять параллельный обход списков в циклах for
или, например, выполнять параллельную сортировку.
Вот пример работы с функцией zip
:
>>> list_a = [0, 1, 2] >>> list_b = ['zero', 'one', 'two'] >>> list_c = ['cero', 'uno', 'dos'] >>> list(zip(list_a, list_b, list_c)) [(0, 'zero', 'cero'), (1, 'one', 'uno'), (2, 'two', 'dos')] >>> for a, b, c in zip(list_a, list_b, list_c): ... print(f'{a} is {b} in English and {c} in Spanish.') ... 0 is zero in English and cero in Spanish. 1 is one in English and uno in Spanish. 2 is two in English and dos in Spanish.
Вернуть скомбинированные элементы в обычное состояние можно, воспользовавшись оператором *
.
>>> z = list(zip(list_a, list_b, list_c)) >>> a, b, c = zip(*z) >>> a (0, 1, 2) >>> b ('zero', 'one', 'two') >>> c ('cero', 'uno', 'dos')
7. Функция enumerate
На первый взгляд функция enumerate
может показаться сложной, но, если с ней разобраться, оказывается, что она способна пригодиться во многих случаях. Функция enumerate
позволяет создавать автоматический счётчик, который часто используется в циклах for
.
В таких циклах не нужно создавать и инкрементировать переменную-счётчик, используя конструкции вродеcounter = 0
иcounter += 1
Функции zip
и enumerate
– это два мощнейших инструмента, применяемых при конструировании циклов for
:
>>> upperCase = ['A', 'B', 'C', 'D', 'E', 'F'] >>> lowerCase = ['a', 'b', 'c', 'd', 'e', 'f'] >>> for count, (upper, lower) in enumerate(zip(upperCase, lowerCase), 1): ... print(f'{count}: {upper} and {lower}.') ... 1: A and a. 2: B and b. 3: C and c. 4: D and d. 5: E and e. 6: F and f.
В данном случае переменная count
используется как автоматический счетчик.
Веселый бонус в конце
Дочитали статью? Наверняка многие из вас знают про Дзен Python, выводимый интерпретатором по команде import this
. В третьей версии Python спрятаны и некоторые другие «пасхалки»:
import antigravity import __hello__
Материал подготовлен образовательной организацией Python Academy.