16 Полезных односложных выражений Python для упрощения обычных задач

Хотите писать элегантный и питонический код? Вот список полезных однострочных фраз Python для выполнения простых задач. Если вы начинающий программист Python, вы потратите время на понимание основных структур данных, таких как списки и строки. А некоторые операции над этими структурами данных можно выполнить с помощью лаконичных однострочных фрагментов кода. Как программист, вы должны отдавать предпочтение читабельности и удобству сопровождения, а не сокращению кода. Но в Python легко придумать однострочные фрагменты, которые соответствуют хорошей практике кодирования. В этой статье мы сосредоточимся на однострочниках для простых задач обработки списков и строк в Python. Давайте приступим!

Генерация списка чисел

Самый простой способ создания списка чисел – это использование функции range(). Функция range() возвращает объект range, который можно преобразовать в список. Использование range(num) даст последовательность 0, 1, 2,…, num-1.

>>> nums = list(range(10))
>>> nums
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Подробнее об использовании функции range()

Вы также можете использовать функцию range() вместе с необязательным значением шага. Так, range (start, end, step) даст последовательность start, start + step, start + 2*step и так далее. Последним значением будет start + k*step такое, что (start + k*step) < end и (start + (k+1)*step) > end.

Поиск максимального и минимального значений в списке

Вы можете использовать встроенные функции max и min для вычисления максимального и минимального элементов в списке, соответственно.

>>> min_elt, max_elt = min(nums), max(nums)
>>> min_elt
0
>>> max_elt
9

Замечание о множественном присваивании

Обратите внимание, что мы присвоили значения min_elt и max_elt в одном операторе присваивания. Python поддерживает такое множественное присваивание. Это может быть полезно при распаковке итераций и присвоении значений нескольким переменным одновременно.

Удаление дубликатов из списка

Еще одна распространенная операция – удаление дубликатов из списков Python. Это необходимо, когда нужно работать только с уникальными значениями. Самый простой способ сделать это – преобразовать список в множество. Множество – это встроенная структура данных, все элементы которой уникальны и хэшируемы.

>>> nums1 = [2,4,7,9,7,10]

В nums1 элемент 7 встречается дважды. Преобразование в множество удалит дубликат (здесь 7), оставив нам список уникальных значений. Поскольку нам все еще нужно работать со списком, мы преобразуем множество обратно в список. Эту операцию можно выполнить с помощью следующей строки кода:

>>> nums1 = list(set(nums1))
>>> nums1
[2, 4, 7, 9, 10]

Подсчет повторений в списке

Чтобы подсчитать, сколько раз элемент встречается в списке, можно использовать встроенный метод count(). list.count(elt) возвращает количество раз, когда elt встречается в списке.

>>> nums
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Здесь 7 встречается один раз в списке nums, поэтому метод count() возвращает 1.

>>> nums.count(7)
1

Проверьте, все ли элементы списка удовлетворяют условию

Чтобы проверить, все ли элементы списка удовлетворяют условию, можно использовать встроенную в Python функцию all(). Функция all() принимает в качестве аргумента итерабельную переменную и возвращает True, если все элементы итерабельной переменной имеют значение True (или являются истинными). Здесь мы хотим проверить, все ли элементы в списке nums2 нечетные.

>>> nums2 = [3,4,7,11,21,67,12]

Мы можем использовать понимание списка для построения списка булевых чисел и передать этот список в качестве аргумента функции all(). Здесь num%2!=0 будет False для элементов 4 и 12, которые являются четными. Поэтому список булевых чисел, построенный с помощью выражения list comprehension, содержит False (и all(list) возвращает False).

>>> all([num%2!=0 for num in nums2])
False

Важно отметить, что all([]) (all(any-empty-iterable) возвращает True.

Проверьте, удовлетворяет ли условию любой элемент в списке

Чтобы проверить, удовлетворяет ли условию любой элемент списка, вы можете использовать функцию any(). any(some-list) возвращает True, если хотя бы один элемент оценивается как True.

>>> nums2 = [3,4,7,11,21,67,12]

Как и в предыдущем примере, мы используем понимание списка, чтобы получить список булевых чисел. Список nums содержит четные числа. Поэтому функция any() возвращает True.

>>> any([num%2 for num in nums2])
True

Обратное преобразование строки

В Python строки неизменяемы, поэтому, когда вы хотите обратить строку, вы можете получить только обратную копию строки. Есть два распространенных подхода – оба могут быть написаны в виде однострочных команд Python – которые используют нарезку строк и встроенные функции.

Использование нарезки строк

Нарезка строк с отрицательными значениями шага возвращает фрагмент строки, начиная с конца. Синтаксис: string[start:stop:step]. Что же возвращает установка step равным -1 и игнорирование индексов start и stop? Возвращается копия строки, начиная с конца строки, включая каждый символ.

>>> str1[::-1]
'olleh'

Использование функции reversed()

Встроенная функция reversed() возвращает обратный итератор по последовательности.

>>> reversed(str1)
<reversed object at 0x008BAF70>
>>> for char in str1:
...     print(char)
...
h
e
l
l

o

Вы можете использовать его в сочетании с методом join(), как показано на рисунке:

>>> ''.join(reversed(str1))
'olleh'

Преобразование строки в список символов

Предположим, мы хотим разделить строку на список символов. Мы можем сделать это с помощью выражения list comprehension.

>>> str1 = 'hello'

Понимание списков – один из самых мощных однолинейных инструментов в Python. Мы проходим по строке и собираем каждый символ.

>>> chars = [char for char in str1]
>>> chars
['h', 'e', 'l', 'l', 'o']

Чтобы разбить строку на список символов, можно также использовать конструктор list():

>>> str1 = 'hello'
>>> chars = list(str1)
>>> chars
['h', 'e', 'l', 'l', 'o']

Чтобы разделить длинную строку на список строк при каждом появлении пробела, можно использовать метод split().

>>> str2 = 'hello world'
>>> str2.split()

['hello', 'world']

Извлечение цифр из строки

Мы уже видели, как использовать понимание списка для разбиения строки на список символов. В том примере мы собрали все символы, выполнив цикл по строке. Здесь нам нужно пройтись по строке и собрать только цифры. Как же нам это сделать?

  • Мы можем задать условие фильтрации в выражении для понимания списка с помощью метода isdigit().
  • c.isdigit() возвращает True, если c является цифрой; в противном случае возвращается False.
>>> str3 = 'python3'
>>> digits = [c for c in str3 if c.isdigit()]
>>> digits

['3']

Проверка, начинается ли строка с определенной подстроки

Чтобы проверить, начинается ли строка с определенной подстроки, вы можете использовать метод startswith() string. str1.startswith(substring) возвращает True, если str1 начинается с подстроки. В противном случае возвращается False.

Вот несколько примеров:

>>> str4 = 'coding'
>>> str4.startswith('co')

True
>>> str5 = 'python'
>>> str5.startswith('co')

False

Проверка, заканчивается ли строка определенной подстрокой

Как вы уже догадались, чтобы проверить, заканчивается ли строка заданной подстрокой, вы можете использовать метод endswith().

>>> str5 = 'python'
>>> str5.endswith('on')

True

Мы также можем использовать метод string внутри выражения для понимания списка, чтобы получить ends_with, список булевых значений.

>>> strs = ['python','neon','nano','silicon']
>>> ends_with = [str.endswith('on') for str in strs]
>>> ends_with

[True, True, False, True]

Объединение элементов списка в строку

Мы уже видели, как разделить строку на список символов. Теперь как выполнить обратную операцию – объединить элементы списка в строку? Для этого можно использовать строковый метод join() с синтаксисом: separator.join(some-list). Мы хотим объединить только элементы списка в одну строку; нам не нужен никакой разделитель. Поэтому мы задаем разделителем пустую строку.

>>> list_1 = ['p','y','t','h','o','n','3']
>>> ''.join(list_1)

'python3'

Создание словаря Python

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

>>> names = ['Joe','Amy','Jake','Florence']

Мы создаем names_d, словарь, содержащий строки имен в качестве ключей и длины строк в качестве значений.

>>> names_d = {name:len(name) for name in names}
>>> names_d

{'Joe': 3, 'Amy': 3, 'Jake': 4, 'Florence': 8}

Условное присвоение значений переменным

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

>>> age = 21
>>> allowed = True if age >= 18 else False
>>> allowed

True

Генерировать все перестановки

Перестановка относится к возможному расположению элементов в группе. Если в группе есть n уникальных элементов, то существует n! возможных способов их расположения – следовательно, n! перестановок. Давайте воспользуемся следующим списком букв:

>>> letters = ['a','b','c']

Вы можете использовать перестановки из модуля itertools для генерации всех возможных перестановок заданной итерации.

>>> letters_p = permutations(letters)
>>> letters_p

<itertools.permutations object at 0x0127AF50>

Как видно, использование permutations(iterable) возвращает объект перестановки, который мы можем просмотреть с помощью цикла for:

>>> for p in letters_p:
...     print(p)
...
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')

('c', 'b', 'a')

Но мы можем переписать его как однострочное выражение, приведя объект перестановки к списку:

>>> letters_p = list(permutations(letters))
>>> letters_p
[('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')]

Здесь есть три уникальных элемента, и существует 3!=6 возможных перестановок.

Генерация подмножеств списка

Иногда вам может понадобиться построить все возможные подмножества определенного размера из списка или других итераций. Возьмем список букв и получим все подсписки размера 2. Для этого мы можем использовать комбинации из модуля itertools, например, так:

>>> from itertools import combinations
>>> letters_2 = list(combinations(letters,2))
>>> letters_2
[('a', 'b'), ('a', 'c'), ('b', 'c')]

Заключение

В этом уроке мы рассмотрели полезные односложные выражения Python для выполнения распространенных операций над списками и строками. Мы также познакомились с такими однострочными операторами, как Python list и dictionary comprehensions, и узнали, как использовать их в сочетании со встроенными функциями для выполнения необходимых задач.