Розуміння списку в Python – із прикладами

У мові програмування Python, конструкція, відома як “генератори списків”, є потужним інструментом для створення нових списків на основі існуючих ітерованих об’єктів, таких як списки, рядки та кортежі.

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

Протягом наступних кількох хвилин ви навчитеся:

  • Створювати нові списки, використовуючи цикли for.
  • Використовувати синтаксис генераторів списків у Python.
  • Модифікувати генератори списків за допомогою умовних виразів if.

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

Тож почнемо! 🌊

Створення списків у Python за допомогою циклів for

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

nums = [2,3,5,7]
num_cubes = []
for num in nums:
  num_cubes.append(num**3)

print(num_cubes)

# Output
[8, 27, 125, 343]

У наведеному вище прикладі:

  • Ми ініціалізуємо порожній список num_cubes.
  • Ми перебираємо список nums.
  • Для кожного числа num ми обчислюємо його куб за допомогою оператора ** (піднесення до степеня).
  • Потім додаємо обчислене значення до списку num_cubes.

Примітка: У Python оператор піднесення до степеня ** використовується в форматі num**pow, де num підноситься до степеня pow.

Проте, за допомогою генераторів списків, цей процес можна зробити більш простим. Розглянемо їхній синтаксис.

Синтаксис генераторів списків Python

Загальний синтаксис генератора списків виглядає так:

<новий_список> = [<вираз> for <елемент> in <ітерований_об'єкт>]

Розберемо цей синтаксис:

  • Списки в Python позначаються квадратними дужками [], тому вираз генератора списку повинен бути вкладений в них.
  • Конструкція <елемент> in <ітерований_об'єкт> означає, що ми перебираємо ітерований об’єкт. Ітерованими вважаються об’єкти Python, які можна перебирати в циклі та отримувати доступ до їхніх окремих елементів (наприклад, списки, кортежі та рядки).
  • <вираз> – це значення, яке обчислюється для кожного елемента <елемент> в <ітерований_об'єкт> і стає частиною нового списку.

Звучить просто, чи не так?

По суті, ми виконуємо певну дію над кожним елементом списку (чи іншого ітерованого об’єкта) для створення нового списку.

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

Синтаксис генератора списку Python (зображення автора)

Тепер, коли ви ознайомилися з синтаксисом, настав час перейти до практики. Для виконання цих прикладів ви можете використовувати онлайн-інтерпретатор Python IDE від techukraine.net або запустити код на своєму локальному комп’ютері.

Приклади генераторів списків Python

У попередньому розділі ми створили список num_cubes зі списку nums. Давайте перепишемо цей приклад за допомогою генератора списків.

Використання генераторів списків з числами

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

  • <виконати_дію>: Тут потрібно піднести кожне число до куба. Отже, замінюємо <виконати_дію> на num**3.
  • <усі_елементи>: Циклічна змінна num, що представляє окремі числа в списку.
  • <цей_список>: Наявний список, який ми маємо, це nums.
  • Отже, [num**3 for num in nums] – це остаточний вираз. ✅

Об’єднуючи все разом, ми отримуємо наступний код:

num_cubes = [num**3 for num in nums]
print(num_cubes)

# Output
[8, 27, 125, 343]

Вітаємо, ви написали свій перший генератор списків! 🎉

Рухаємося далі і попрацюємо з рядками Python.

Використання генераторів списків з рядками

Припустимо, у вас є список авторів. Ви можете переписати цей список, додавши своїх улюблених авторів. 😄

authors = ["jane austen","george orwell","james clear","cal newport"]

Зауважте, що імена авторів у списку написані малими літерами. Тепер нам потрібно відформатувати їх, щоб кожне слово починалося з великої літери, та зберегти у новому списку під назвою author_list.

Примітка: У Python метод рядка title() приймає рядок як аргумент і повертає копію рядка, де перша літера кожного слова написана з великої літери: Ім’я Прізвище.

Отже, ось що потрібно зробити:

  • Перебрати список authors, і для кожного автора у списку,
  • викликати метод author.title(), щоб отримати копію рядка у форматі заголовка.

Код Python для цього виглядає так:

authors = ["jane austen","george orwell","james clear","cal newport"]

author_list = [author.title() for author in authors]
print(author_list)

# Output
['Jane Austen', 'George Orwell', 'James Clear', 'Cal Newport']

У вихідному результаті ви бачите, як імена всіх авторів були відформатовані у форматі заголовка — саме те, що нам потрібно.

Використання генераторів списків з декількома списками

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

Наприклад, розглянемо таку задачу: у вас є два списки l_arr та b_arr, які містять довжини та ширини 4 прямокутників відповідно.

Вам потрібно створити новий список area, який містить площі цих 4 прямокутників. Пам’ятайте, що площа = довжина * ширина.

l_arr = [4,5,1,3]
b_arr = [2,1,7,9]

Для обчислення площі вам знадобляться елементи з обох списків (l_arr та b_arr). Це можна зробити за допомогою функції zip() Python.

Примітка: Функція zip() в Python приймає один або кілька ітерованих об’єктів як аргументи (синтаксис: zip(*iterables)). Потім вона повертає ітератор кортежів, де i-й кортеж містить i-й елемент з кожного ітерованого об’єкта.

На наступному зображенні це показано детальніше. У вас є 4 значення в l_arr та b_arr, тому діапазон індексів становить від 0 до 3. Як бачите, кортеж 0 містить l_arr[0] та b_arr[0], кортеж 1 містить l_arr[1] та b_arr[1] і так далі.

Функція Python zip() (Зображення автора)

Таким чином, ви можете перебрати елементи за допомогою zip(l_arr, b_arr), як показано нижче:

area = [l*b for l,b in zip(l_arr,b_arr)]
print(area)

# Output
[8,5,7,27]

У наступному розділі ви дізнаєтеся, як використовувати умовні вирази в генераторах списків.

Генератори списків Python з умовним синтаксисом

Почнемо з попереднього синтаксису генератора списків.

Синтаксис виглядає так:

<новий_список> = [<вираз> for <елемент> in <ітерований_об'єкт> if <умова>]

Замість того, щоб обчислювати <вираз> для всіх елементів, ви хочете зробити це лише для тих елементів, які задовольняють певній <умові>, де умова має значення True. Це веде до спрощеного синтаксису, як показано:

Python List Comprehension with Condition Syntax (Зображення автора)

▶ Перейдемо до прикладів коду.

Приклади генераторів списків Python з умовами

#1. У вас є рядок “Я вивчаю Python у 2022 році”. Ви хочете створити список усіх цифр у цьому рядку. Як це зробити?

У Python метод <символ>.isdigit() перевіряє, чи є <символ> цифрою (0-9). Він повертає True, якщо це цифра, інакше False.

Наступний код показує, як можна створити список усіх цифр у рядку str1.

str1 = "I'm learning Python3 in 2022"

digits = [char for char in str1 if char.isdigit()]

print(digits)

# Output
['3', '2', '0', '2', '2']

У наведеному вище коді:

  • Ми перебираємо рядок str1,
  • отримуємо доступ до кожного символу, щоб перевірити, чи є він цифрою, використовуючи метод isdigit(), і
  • додаємо символ char до нового списку digits, лише якщо це цифра.

Розглянемо інший приклад.

#2. У вас є список фруктів. 🍊 І ви хочете створити список starts_with_b, який містить усі фрукти зі списку fruits, що починаються з літери “b”. Для запису умови можна використовувати метод startswith().

Метод <рядок>.startswith('символ') повертає True, якщо <рядок> починається з 'символ'; інакше повертає False.

fruits = ['blueberry','apple','banana','orange','cherry']

starts_with_b = [fruit for fruit in fruits if fruit.startswith('b')]

print(starts_with_b)

# Output
['blueberry', 'banana']

У вихідних даних ми отримуємо “чорницю” і “банан”, які є двома фруктами, що починаються з “b” у списку fruits, як ми і очікували.

На цьому наша дискусія про генератори списків закінчується.

Висновок

Сподіваюся, цей посібник допоміг вам зрозуміти генератори списків у Python.

Підсумуємо:

  • Ви можете використовувати [<зробити_це> for <усі_елементи> in <цей_список>], щоб створити новий список за допомогою генератора списків.
  • Додатково, можна використовувати синтаксис [<зробити_це> for <усі_елементи> in <цей_список> if <умова_істина>] з умовним виразом if.

Крім того, ми розглянули декілька прикладів. Наступним кроком може бути спроба переписати деякі з ваших існуючих циклів Python для створення списків за допомогою генераторів списків. Щасливого програмування! До наступного уроку. 😄

Тепер ви можете подивитися, як перетворити список на словник, або дізнатися, як працювати з файлами в Python.