Списки
Огляд
Викладання: 10 хв
Вправи: 10 хвПитання
Як я можу зберігати набори значень?
Цілі
Пояснити, навіщо програмам потрібні колекції значень
Писати програми, які створюють плоскі списки, індексують їх, розрізають і змінюють через призначення та виклики методів.
Список є структурою даних, яка містить в собі багато значень.
- Виконання обчислень із сотнею змінних під назвою
pressure_001
,pressure_002
тощо, було б принаймні так само повільно, як робити їх вручну. - Використовуйте список для зберігання багатьох значень разом.
- Список позначається квадратними дужками
[...]
. - Значення розділяються комами
,
.
- Список позначається квадратними дужками
- Використовуйте
len
, щоб дізнатися, скільки значень у списку.
pressures = [0.273, 0.275, 0.277, 0.275, 0.276]
print('pressures:', pressures)
print('length:', len(pressures))
pressures: [0.273, 0.275, 0.277, 0.275, 0.276]
length: 5
Щоб отримати елемент списку, використовуйте його індекс.
- Це робиться так само, як і при роботі з рядками.
print('zeroth item of pressures:', pressures[0])
print('fourth item of pressures:', pressures[4])
zeroth item of pressures: 0.273
fourth item of pressures: 0.276
Значення елементів списків можна замінити шляхом присвоєння.
- Використовуйте індексний вираз ліворуч від знаку присвоєння, щоб замінити значення.
pressures[0] = 0.265
print('нові значення pressures:', pressures)
Нові значення pressures: [0.265, 0.275, 0.277, 0.275, 0.276]
Додавання елементів до списку подовжує його.
- Щоб додати елементи в кінець списку, використовуйте
list_name.append
.
primes = [2, 3, 5]
print('початкові значення списку primes:', primes)
primes.append(7)
primes.append(9)
print('список primes змінився:', primes)
початкові значення primes: [2, 3, 5]
список primes змінився: [2, 3, 5, 7, 9]
append
є методом, який належить до списків.- Методи подібні функціям, але вони прив’язані до певних об’єктів.
- Для виклику методів використовується синтаксис
object_name.method_name
.- Такий запис навмисно нагадує те, як ми посилаємось на щось визначене у будь-якій бібліотеці.
- По ходу роботи ми познайомимося з іншими методами, визначеними для списків.
- Якщо бажаєте подивитись на них зараз, використовуйте
help(list)
.
- Якщо бажаєте подивитись на них зараз, використовуйте
extend
- це метод, схожий наappend
, але він дозволяє об’єднувати два списки. Наприклад:
teen_primes = [11, 13, 17, 19]
middle_aged_primes = [37, 41, 43, 47]
print('поточний список primes:', primes)
primes.extend(teen_primes)
print('розширений список primes:', primes)
primes.append(middle_aged_primes)
print('фінальний список primes:', primes)
поточний список primes: [2, 3, 5, 7, 9]
розширений список primes: [2, 3, 5, 7, 9, 11, 13, 17, 19]
фінальний список primes: [2, 3, 5, 7, 9, 11, 13, 17, 19, [37, 41, 43, 47]]
Зауважимо, що хоча extend
підтримує “плоску” структуру списку, додавання списку до списку дає результат
двовимірний - останній елемент у primes
є списком, а не цілим числом.
Щоб повністю видалити елементи зі списку, використовуйте del
.
del list_name[index]
видаляє елемент зі списку та скорочує список.del
- це оператор мови програмування, а не функція і не метод.
primes = [2, 3, 5, 7, 9]
print('список primes перед видаленням останнього елемента:', primes)
del primes[4]
print('список primes після видалення останнього елемента:', primes)
список primes перед видаленням останнього елемента: [2, 3, 5, 7, 9]
список primes після видалення останнього елемента: [2, 3, 5, 7]
Порожній список не містить жодних значень.
- Щоб створити список, який не містить жодних значень, використовуйте
[]
.- Порожній список - це “нуль списків.”
- Він є корисним як початкова точка для збору значень (ми це побачимо в наступному епізоді.
Списки можуть містити значення різних типів.
- Один список може містити числа, рядки та будь-що інше.
goals = [1, 'Створити списки.', 2, 'Вилучити елементи із списків.', 3, 'Змінити списки.']
Рядки символів можна індексувати як списки.
- Отримати окремі символи з рядка символів можна за допомогою індексів у квадратних дужках.
element = 'carbon'
print('нульовий символ:', element[0])
print('третій символ:', element[3])
нульовий символ: c
третій символ: b
Рядки символів незмінні.
- Неможливо змінити символи в рядку після його створення.
- Незмінний - тобто який не можна змінити після створення.
- На відміну від рядків, списки є змінними: їх можна змінювати на місці.
- Python розглядає рядок як одне значення з частинами, а не як сукупність значень.
element[0] = 'C'
TypeError: об'єкт 'str' не підтримує призначення елементів
- Списки та рядки символів є колекціями.
Індексація після кінця колекції є помилкою.
- Python повідомляє про помилку
IndexError
, якщо ми намагаємося отримати доступ до значення, якого не існує.- Це свого роду помилка виконання.
- Цю помилку неможливо виявити під час аналізу коду, оскільки індекс може бути розрахований на основі даних.
print('99м елементом списку element є:', element[99])
IndexError: string index out of range
Заповнити пропущені місця
Заповніть порожні поля, щоб програма, наведена нижче, видала показаний результат.
values = ____ values.____(1) values.____(3) values.____(5) print('перший раз:', values) values = values[____] print('другий раз:', values)> ~~~ {: .language-python}
перший раз: [1, 3, 5] другий раз: [3, 5] ~~~
Рішення
values = [] values.append(1) values.append(3) values.append(5) print('перший раз:', values) values = values[1:] print('другий раз:', values)
Наскільки є великим зріз?
Якщо «low» і «high» є невід’ємними цілими числами, яка довжина списку
values[low:high]
?>Рішення
Список
values[low:high]
маєhigh - low
elements. Наприклад,values[1:4]
має 3 елементиvalues[1]
,values[2]
, andvalues[3]
. Зауважимо, що зріз працюватиме, лише якщоhigh
менше загальної довжини спискузначень
.
Від рядків до списків і назад.
Дано:
print('рядок у список:', list('tin')) print('список у рядок:', ''.join(['g', 'o', 'l', 'd']))
['t', 'i', 'n'] 'gold'
- Що робить
list('якийсь рядок')
?- Що генерує
'-'.join(['x', 'y', 'z'])
?>Рішення
list('якийсь рядок')
перетворює рядок на список, що містить усі його символи.join
повертає рядок, який є конкатенацією кожного елемента рядка у списку та додає роздільник між кожним елементом у списку. Це призводить доx-y-z
. Роздільником між елементами є рядок, який забезпечує цей метод.
Початок з кінця
Що друкує наступна програма?
element = 'helium' print(element[-1])
- Як Python інтерпретує від’ємний індекс?
- Якщо список або рядок містить N елементів, який найбільший за модулем від’ємний індекс можна безпечно використовувати, і яку локацію визначає цей індекс?
- Якщо
values
є списком, що робитьdel values[-1]
- Як ви можете відобразити всі елементи, крім останнього, не змінюючи
values
? (Підказка: вам потрібно буде поєднати зрізи та від’ємну індексацію.)Рішення
Програма надрукує
m
.
- Python інтерпретує від’ємний індекс як початок з кінця (на відміну від початку). Останній елемент –
-1
.- Останнім індексом, який можна безпечно використовувати зі списком із N елементів, є елемент
-N
, який представляє перший елемент.del values[-1]
видаляє останній елемент зі списку.values[:-1]
Перехід по списку
Що друкує наступна програма?
element = 'fluorine' print(element[::2]) print(element[::-1])
- Якщо ми пишемо фрагмент як
low:high:stride
, що робитьstride
?- Яка команда дозволить вибрати всі елементи з парними номерами з колекції?
Рішення
Програма надрукує
furn eniroulf
stride
є розміром кроку зріза- Зріз
1::2
вибирає всі елементи з парними номерами з колекції: він починається з елементу1
(який є другим елементом, оскільки індексація починається з0
), продовжується до кінця (оскількиend
не задано) і використовує розмір кроку2
(таким чином обираючи кожний другий елемент).
Границі зрізу
Що друкує наступна програма?
element = 'lithium' print(element[0:20]) print(element[-1:3])
Рішення
lithium
Сортування на місці чи у новий список
Що друкують ці дві програми? Простими словами поясніть різницю між
sorted(letters)
andletters.sort()
.# Програма A letters = list('gold') result = sorted(letters) print('letters is', letters, 'and result is', result)
# Програма B letters = list('gold') result = letters.sort() print('letters is', letters, 'and result is', result)
Рішення
Програма A друкує
літери ['g', 'o', 'l', 'd'] і результат є таким: ['d', 'g', 'l', 'o']
Програма В друкує
літери ['d', 'g', 'l', 'o'] і результат є None
sorted(letters)
повертає відсортовану копію спискуletters
(оригінал спискуletters
залишається без змін), тоді якletters.sort()
сортує списокletters
на місці та нічого не повертає.
Копіювання (чи ні)
Що друкують ці дві програми? Простими словами поясніть різницю між
new = old
andnew = old[:]
.# Програма A old = list('gold') new = old # просте присвоювання new[0] = 'D' print('новим є', new, 'і старим є', old)
~~~Програма B old = list(‘gold’) new = old[:] # присвоювання зріза new[0] = ‘D’ print(‘новим є’, new, ‘і старим є’, old) ~~~
Рішення
Програма А друкує
новим є ['D', 'o', 'l', 'd'] і старим є ['D', 'o', 'l', 'd']
Програма В друкує
новим є ['D', 'o', 'l', 'd'] і старим є ['g', 'o', 'l', 'd']
new = old
робитьnew
посиланням на списокold
;new
andold
вказують на той самий об’єкт.
new = old[:]
однак створює новий об’єкт спискуnew
, який містить усі елементи зі спискуold
;new
таold
є різними об’єктами.
Ключові моменти
Список зберігає багато значень в одній структурі.
Використовуйте індекс елемента, щоб отримати його зі списку.
Значення списків можна замінити шляхом присвоєння.
Додавання елементів до списку подовжує його
Використовуйте
del
, щоб повністю видалити елементи зі списку.Порожній список не містить значень.
Списки можуть містити значення різних типів.
Рядки символів можна індексувати як списки.
Рядки символів є незмінними.
Індексація за межами колекції є помилкою..