У попередніх статтях ви дізналися, як звертатися до окремих елементів списку і ознайомились із перебором всіх елементів списку. Також можна працювати з конкретною підмножиною елементів списку; в Python такі підмножини називаються зрізами (slices).
Створення зрізу.
Щоб створити зріз списку, слід задати індекси першого і останнього елементів, з якими ви маєте намір працювати. Як і у випадку з функцією range(), Python зупиняється на елементі, що передує другому індексу. Скажімо, щоб
вивести перші три елементи списку, запитайте індекси з 0 по 3, і ви отримаєте елементи 0, 1 і 2. У наступному прикладі використовується список гравців команди:
players = [ 'charles', 'martina', 'michael', 'florence', 'eli']
.1. print(players[0:3])
У точці .1. виводиться зріз списку, що включає тільки перших трьох гравців. Вивід зберігає структуру списку, але включає тільки перших трьох гравців:
[ 'charles', 'martina', 'michael']
Підмножина може включати будь-яку частину списку. Наприклад, щоб обмежитися другим, третім і четвертим елементами списку, зріз починається з індексу 1 і закінчується на індексі 4:
players = [ 'charles', 'martina', 'michael', 'florence', 'eli']
print(players[1:4])
На цей раз зріз починається з елемента 'martina' і закінчується елементом 'florence':
[ 'martina', 'michael', 'florence']
Якщо перший індекс зрізу не вказано, то Python автоматично починає зріз від початку списку:
players = [ 'charles', 'martina', 'michael', 'florence', 'eli']
print (players [:4])
Без початкового індексу Python бере елементи від початку списку:
[ 'charles', 'martina', 'michael', 'florence']
Аналогічний синтаксис працює і для зрізів, що включають кінець списку. наприклад, якщо вам потрібні всі елементи з третього до останнього, почніть з індексу 2 і не вказуйте другий індекс:
players = [ 'charles', 'martina', 'michael', 'florence', 'eli']
print(players[2:])
Python повертає всі елементи з третього до кінця списку:
[ 'Michael', 'florence', 'eli']
Цей синтаксис дозволяє вивести всі елементи від будь-якої позиції до кінця списку незалежно від його довжини. Згадайте, що негативний індекс повертає елемент, що знаходиться на заданій відстані від кінця списку; отже, ви
можете отримати будь-який зріз від кінця списку. Наприклад, щоб відібрати останніх трьох гравців, використовуйте зріз players[-3:]:
players = [ 'charles', 'martina', 'michael', 'florence', 'eli']
print (players[-3:])
Програма виводить імена трьох останніх гравців, причому продовжує працювати навіть при зміні розміру списку.
Перебір вмісту зрізу.
Якщо ви хочете перебрати елементи, що входять до підмножина елементів, використовуйте зріз в циклі for. У наступному прикладі програма перебирає перших трьох гравців і виводить їх імена:
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print ("Here are the first three players on my team:")
.1. for player in players[: 3]:
print (player.title())
Замість того щоб перебирати весь список гравців .1., Python обмежується першими трьома іменами:
Here are the first three players on my team:
Charles
Martina
Michael
Зрізи приносять величезну користь у багатьох ситуаціях. Наприклад, при створенні комп'ютерної гри підсумковий рахунок гравця може додаватися в список після закінчення поточної партії. Після цього програма може отримати три кращі результати гравця, відсортувавши список по спаданні і отримавши зріз, що включає тільки три елементи. При роботі з даними, зрізи можуть використовуватися для обробки даних блоками заданого розміру. Або при побудові веб-додатків, зрізи можуть використовуватися для посторінкового виводу інформації так, щоб на кожній сторінці виводився необхідний обсяг інформації.
Копіювання списку.
Часто розробник бере існуючий список і створює на його основі абсолютно новий. Подивимося, як працює копіювання списків, і розглянемо одну ситуацію, в якій копіювання списку може принести користь. Щоб скопіювати список, створіть зріз, що включає весь вихідний список проте не вказуйте першого і другого індексу ([:]). Ця конструкція створює зріз, який починається з першого елемента і завершується останнім; в результаті
створюється копія всього списку. Уявіть, що ви створили список своїх улюблених страв і тепер хочете створити
окремий список страв, які подобаються вашому другу. Поки вашому другу подобаються всі страви з нашого списку, тому ви можете створити інший список простим копіюванням нашого:
.1. my_foods = [ 'pizza', 'falafel', 'carrot cake']
.2. friend_foods = my_foods [:]
print( "My favorite foods are:")
print(my_foods)
print("\n My friend's favorite foods are:")
print(friend_foods)
У точці .1. створюється список страв з ім'ям my_foods. У точці .2. створюється інший список з ім'ям friend_foods. Щоб створити копію my_foods, програма запрошує зріз my_foods без вказування індексів, і ми зберігаємо копію
в friend_foods. При виведенні обох списків стає видно, що вони містять однакові дані:
My favorite foods are:
[ 'pizza', 'falafel', 'carrot cake']
My friend's favorite foods are:
[ 'pizza', 'falafel', 'carrot cake']
Щоб довести, що насправді йдеться про двох різні списки, додамо нове блюдо в кожен список:
my_foods = [ 'pizza', 'falafel', 'carrot cake']
.1. friend_foods = my_foods[:]
.2. my_foods.append( 'cannoli')
.3. friend_foods.append( 'ice cream')
print("My favorite foods are:")
print(my_foods)
print("\n My friend's favorite foods are:")
print(friend_foods)
У точці .1. вихідні елементи my_foods копіюються в новий список friend_foods, як було зроблено в попередньому прикладі. Потім в .2. кожен список додається новий елемент: 'cannoli' в my_foods, і 'ice cream' в friend_foods. Після цього результат двох списків наочно показує, що кожне блюдо знаходиться у відповідному списку.
My favorite foods are:
.1. ['pizza', 'falafel', 'carrot cake', 'cannoli']
My friend's favorite foods are:
.2. ['pizza', 'falafel', 'carrot cake', 'ice cream']
Результат в точці .1. показує, що елемент cannoli 'знаходиться в списку my_foods, а елемент 'ice cream' до цього списку не входить. У точці .2. видно, що 'ice cream' входить в список friend_foods, а елемент 'cannoli' до цього списку не входить. Якщо б ці два списки просто збігалися, то їх вміст вже не відрізнялося б. Наприклад, ось що відбувається при спробі копіювання списку без використання зрізу:
my_foods = ['pizza', 'falafel', 'carrot cake']
# This does not work:
.1. friend_foods = my_foods
my_foods.append( 'cannoli')
friend_foods.append ('ice cream')
print("My favorite foods are:")
print(my_foods)
print("\n My friend's favorite foods are:")
print(friend_foods)
Замість того щоб зберігати копію my_foods в friend_foods в точці .1., ми задаємо friend_foods рівним my_foods. Цей синтаксис в дійсності повідомляє Python, що нова змінна friend_foods повинна бути пов'язана зі списком my_foods, тому тепер обидві змінні зв'язані з одним списком. В результаті при додаванні елемента 'cannoli' в my_foods цей елемент також з'являється в friend_foods. Аналогічним чином елемент 'ice cream' з'являється в обох списках, хоча на перший погляд він був доданий тільки в friend_foods. Результат показує, що обидва списки містять однакові елементи, а це зовсім не те, що було потрібно:
My favorite foods are:
['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']
My friend's favorite foods are:
['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']
- Войдите или зарегистрируйтесь, чтобы оставлять комментарии