16 корисних однострочників Python для спрощення типових завдань

Бажаєте писати витончений код у стилі Python? Пропонуємо вам перелік корисних однорядкових конструкцій Python для виконання нескладних завдань.

Якщо ви лише починаєте свій шлях у програмуванні на Python, вам необхідно освоїти базові структури даних, такі як списки та рядки. І деякі операції над цими структурами можна реалізувати за допомогою стислих однорядкових виразів.

Як програміст, ви повинні ставити на перше місце читабельність та простоту підтримки коду, а не його мінімізацію. Однак, Python дозволяє створювати однорядкові рішення, які відповідають найкращим практикам кодування.

У цій статті ми зосередимося на однорядкових командах для обробки списків та рядків у Python, що використовуються для нескладних операцій.

Отже, почнемо!

Створення списку чисел

Найпростіший спосіб згенерувати список чисел – це застосувати функцію 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(початок, кінець, крок) створить послідовність: початок, початок + крок, початок + 2*крок і т.д. Останнє значення буде початок + k*крок, де (початок + k*крок) < кінець і (початок + (k+1)*крок) > кінець.

Пошук максимального та мінімального значення у списку

Використання вбудованих функцій 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]

📒 Щоб дізнатися більше про різні способи видалення дублікатів зі списків Python, ознайомтеся з цим посібником.

Підрахунок кількості входжень елемента у списку

Для підрахунку, скільки разів елемент зустрічається у списку, використовуйте вбудований метод 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, які є парними. Таким чином, список логічних значень, сформований за допомогою спискового включення, міститиме False (і all(list) поверне False).

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

💡 Важливо відзначити, що all([]) (all(будь-який-порожній-ітератор) повертає 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: з використанням зрізів рядків та вбудованих функцій.

Використання зрізів рядків

Зріз рядка з від’ємними значеннями кроку повертає фрагмент рядка, починаючи з його кінця. Синтаксис: рядок[початок:кінець:крок]. Отже, що поверне встановлення кроку -1 та ігнорування індексів початку та кінця?

Він поверне копію рядка, починаючи з кінця рядка, включаючи кожен символ.

>>> 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'

Перетворення рядка на список символів

Припустимо, нам потрібно розділити рядок на список символів. Для цього можна використовувати спискове включення.

>>> str1 = 'hello'

Спискові включення є одним із найпотужніших однорядкових інструментів у Python.

📒 Дізнайтеся більше про спискові включення в Python.

Перебираємо рядок і збираємо кожен символ.

>>> chars = [char for char in 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(). 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

🔖 Дізнайтеся більше про тернарний оператор у Python.

Генерація всіх перестановок

Перестановка – це можливе розташування елементів у групі. Якщо у групі n унікальних елементів, існує n! можливих способів їхнього розташування, а отже, n! перестановок.

Використаємо наступний список літер:

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

Модуль itertools з функцією permutations використовується для генерації всіх можливих перестановок заданого ітератора.

>>> 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.

Для цього скористаємося функцією combinations з модуля itertools, наступним чином:

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

Висновки

У цьому керівництві ми розглянули корисні однорядкові вирази Python для виконання типових операцій над списками та рядками. Також ми навчилися застосовувати спискові та словникові включення, а також використовувати їх разом із вбудованими функціями для виконання потрібних завдань.

Наступним кроком перегляньте цей список проектів Python, зручних для початківців.