Списки

Огляд

Викладання: 10 хв
Вправи: 10 хв
Питання
  • Як я можу зберігати набори значень?

Цілі
  • Пояснити, навіщо програмам потрібні колекції значень

  • Писати програми, які створюють плоскі списки, індексують їх, розрізають і змінюють через призначення та виклики методів.

Список є структурою даних, яка містить в собі багато значень.

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]

Додавання елементів до списку подовжує його.

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

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

Рядки символів незмінні.

element[0] = 'C'
TypeError: об'єкт 'str' не підтримує призначення елементів

Індексація після кінця колекції є помилкою.

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], and values[3]. Зауважимо, що зріз працюватиме, лише якщо high менше загальної довжини списку значень.

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

Дано:

print('рядок у список:', list('tin'))
print('список у рядок:', ''.join(['g', 'o', 'l', 'd']))
['t', 'i', 'n']
'gold'
  1. Що робить list('якийсь рядок')?
  2. Що генерує '-'.join(['x', 'y', 'z'])?>

    Рішення

    1. list('якийсь рядок') перетворює рядок на список, що містить усі його символи.
    2. join повертає рядок, який є конкатенацією кожного елемента рядка у списку та додає роздільник між кожним елементом у списку. Це призводить до x-y-z. Роздільником між елементами є рядок, який забезпечує цей метод.

Початок з кінця

Що друкує наступна програма?

element = 'helium'
print(element[-1])
  1. Як Python інтерпретує від’ємний індекс?
  2. Якщо список або рядок містить N елементів, який найбільший за модулем від’ємний індекс можна безпечно використовувати, і яку локацію визначає цей індекс?
  3. Якщо values є списком, що робить del values[-1]
  4. Як ви можете відобразити всі елементи, крім останнього, не змінюючи values? (Підказка: вам потрібно буде поєднати зрізи та від’ємну індексацію.)

Рішення

Програма надрукує m.

  1. Python інтерпретує від’ємний індекс як початок з кінця (на відміну від початку). Останній елемент – -1.
  2. Останнім індексом, який можна безпечно використовувати зі списком із N елементів, є елемент -N, який представляє перший елемент.
  3. del values[-1] видаляє останній елемент зі списку.
  4. values[:-1]

Перехід по списку

Що друкує наступна програма?

element = 'fluorine'
print(element[::2])
print(element[::-1])
  1. Якщо ми пишемо фрагмент як low:high:stride, що робить stride?
  2. Яка команда дозволить вибрати всі елементи з парними номерами з колекції?

Рішення

Програма надрукує

furn
eniroulf
  1. stride є розміром кроку зріза
  2. Зріз 1::2 вибирає всі елементи з парними номерами з колекції: він починається з елементу 1 (який є другим елементом, оскільки індексація починається з 0), продовжується до кінця (оскільки end не задано) і використовує розмір кроку 2 (таким чином обираючи кожний другий елемент).

Границі зрізу

Що друкує наступна програма?

element = 'lithium'
print(element[0:20])
print(element[-1:3])

Рішення

lithium

Сортування на місці чи у новий список

Що друкують ці дві програми? Простими словами поясніть різницю між sorted(letters) and letters.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 and new = 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 and old вказують на той самий об’єкт.

new = old[:] однак створює новий об’єкт списку new, який містить усі елементи зі списку old; new та old є різними об’єктами.

Ключові моменти

  • Список зберігає багато значень в одній структурі.

  • Використовуйте індекс елемента, щоб отримати його зі списку.

  • Значення списків можна замінити шляхом присвоєння.

  • Додавання елементів до списку подовжує його

  • Використовуйте del, щоб повністю видалити елементи зі списку.

  • Порожній список не містить значень.

  • Списки можуть містити значення різних типів.

  • Рядки символів можна індексувати як списки.

  • Рядки символів є незмінними.

  • Індексація за межами колекції є помилкою..