Урок 6 – Кортежі, Списки та Словники

Вступ

Ваш мозок ще далі болить від попереднього уроку? 🙂 Без проблем, я спеціально постарався, щоб під час цього уроку ми з вами трошки відпочили. Ми повертаємося до простої теми – змінні – але копнемо трошки глибше.

Давайте задумаємось… Змінні зберігають якусь невелику частинку інформації. Вони можуть повернути її нам у будь-який час, також ми можемо змінити цю інформацію (значення змінної) у будь-який час. Змінні – це чудовий інструмент, щоб зберігати певну інформацію і змінювати її по ходу нашої програми.

Але що, якщо нам потрібно зберегти наприклад цілий довгий список різноманітних “кусочків інформації”? Наприклад: імена місяців року. Або довгий список стрічок, який нам треба з часом змінювати? Наприклад: імена всіх собак чи котів у вашій сім’ї протягом останніх 20-ти років (у мене вони часто змінювалися у дитинстві). Або наприклад – телефонний довідник з усіма його номерами… Для цього нам треба буде мати список усіх імен, а також прив’язаний номер телефону до кожного з імен. Як же ж нам цього досягнути у нашій програмі на мові Python?

Рішення – Кортежі, Списки та Словники

Для вище згаданих трьох випадків, Пітон використовує 3 різні підходи – Кортежі, Списки та Словники. Давайте коротенько пройдемося по кожному з них:

  • Списки – це послідовність певних значень. Кожен елемент у списку є пронумерований і нумерація їхня починається з нуля – тобто перший елемент в списку має номер 0, другий – 1, і т.д. Ми можемо видаляти елементи зі списку, також додавати нові елементи.
  • Кортежі – в основному подібні до списків, але ми не можемо їх змінювати. Послідовність значень, які ми надаємо кортежу в момент його початкового визначення, не може бути змінено пізніше у програмі. Нумерація елементів в кортежі є такою ж самою як і в списку.
  • Словники – можна сказати, що це “розумний список”, який є невпорядкованим, та елементи якого проіндексовані визначеними нами індексами – ключами. А не так як це є в списку: 0, 1, 2, і т.д. Тобто у словниках у нас є чітко виражене поняття індекса, або ще можемо його називати ключем (також словом), кожному з яких відповідає певне встановлене значення – визначення. Таким чином в Словнику ми маємо справу з парами: слово – визначення. Визначення (значення словника) не є окремо пронумеровані, і не мають наперед визначеного порядку. Ми також можемо на ходу змінювати пари у словнику. Приклад словника – телефонна книга, де кожному імені (слову) відповідає номер телефону (визначення).

А тепер давайте пройдемось по кожному з наших складних типів даних окремо і з прикладами. Голова не кипить?

Кортежі

Кортежі достатньо легко створювати. Визначаємо назву нашому кортежу, тоді назначаємо йому послідовністю значень (візьмемо для прикладу список стрічок) розділених комою, і огорнемо це все гарненько в круглі дужки. От і матимемо кортеж назв днів тижня англійською:

Зауважте, перед переходом на наступний рядок в послідовності елементів кортежу після стрічки ‘Friday’ я пропустив знак переводу на новий рядок ‘\’. Це не обов’язково, якщо код огорнутий круглими дужками.

Python інтерпретатор тоді організовує наш кортеж собі у вигляді індекса (таблиці), де кожен елемент кортежа доступний під певним номером – позицією в послідовності:

В наступному параграфі ми розберемо як доступатися до елементів послідовності на прикладі роботи зі списком.

Списки

Списки є дуже подібні до кортежів у плані роботи з ними. Єдині дві відмінності:

  • визначаємо їх не круглими, а квадтратними дужками
  • їх можемо змінювати в процесі програми

Відповідно напрошується питання, а для чого ж нам тоді Кортежі? В основному для двох речей:

  • для підвищення швидкодії програми, якщо не потрібно змінювати послідовність – тоді краще використовувати кортеж, незмінні типи даних завжди ресурсо економніші
  • якщо потрібна константа (незмінюваний список), щоб уникнути випадкових змін (наприклад як передача в ролі аргумента функції) – також краще використовувати Кортеж

Отже визначимо наш перший список:

Маємо послідовність 6-ти стрічок – кольорів в квадтратних дужках, а значить ми визначили саме список, а не кортеж. Тепер давайте спробуємо видрукувати на екран колір червоний (‘red’):

Хто знає, чому саме 3?

Так, адже починаємо нумерацію з нуля, ‘red’ маємо на позиції четвертій, відповідно індекс його буде – 3.

Також ми можемо взяти підмножину нашого списку кольорів, наприклад з першого по третій. Для цього потрібно скористатися двокрапкою (“:”) :

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

Виглядає трохи дивно? Давайте розберемось… Після імені змінної списку (colors) ми бачимо крапочку (“.”). В подальших уроках ми з вами побачимо таких крапочок більше. А поки у двох словах – ми викликали метод (функцію) списку ‘append’, який додає переданий йому аргумент (у нашому випадку це стрічка ‘grey’) до кінця списку. Не повністю зрозуміло? Не хвилюйтесь, у наступних уроках (зокрема Об’єктно Орієнтоване Програмування в Пітоні), ми розглянемо це все в деталях. А поки рухаємося далі.

Після виклику ‘append’ наш список виглядатиме отак:

Бачимо ‘grey’ у кінці списку.

А тепер давайте спробуємо видалити колір ‘black’ з нашої послідовності кольорів. Тут запис буде також цікавий:

Пам’ятаємо, оскільки нумерація починається з 0, то і ‘black’ колір, який є третім у нашому списку – матиме індекс 2. ‘del’ функція (delete) видаляє емелент зі списку colors під індексом 2.

Є ще і інша можливість викинути елемент зі списку. Використовуючи функцію – ‘pop’:

Результат буде аналогічним – список colors без елементу ‘black’:

На цьому закінчуємо ознайомлення зі списками і рухаємось далі – Словники:

Словники

Тепер давайте уявимо, що нам треба створити телефонну книгу. Як вона працює? Ми знаємо ім’я людини, але не знаємо її домашнього номера телефону. У цьому випадку телефонна книга може допомогти (звичайно, якщо людина живе по місцю прописки ;). В цій книзі ми знаходимо людину з даним ім’ям (або адресою) і навпроти даного ім’я будемо мали її домашній номер телефону. Тобто в даній книзі маємо набір пар: ім’я – телефон.

Можемо з цього визначення зрозуміти, що списки чи кортежі нам тут не допоможуть, адже там ключем (індексом) є число. А нам треба щось таке, що має ключами наприклад стрічку – ім’я людини…

Ось тут нам і приходять Пітонівські Словники на допомогу! Словник складається з ключів та значень. В нашій книзі Імена будуть в ролі Ключів, а Номери Телефонів – в ролі Значень словника.

Списки огортаються квадратними дужками, кортежі – круглими, а тепер вгадайте чим огортаються словники? Так – фігурними 🙂

Давайте вже нарешті до прикладу. Визначаємо нашу телефонну книгу – словник:

В даному прикладі ми визначили словник під назвою book, який складається з трьох пар (ключ-значення). Бачимо, що ключ словника є у нашому випадку стрічкою – ім’ям, а значенням словника, яке йде після ключа і двокрапки, є число – номер телефону (телефони видумані ;). Ось такий простий синтаксис словника.

А тепер давайте додамо ще одну людину в нашу книгу:

Ми щойно додали новий ключ ‘Andriy Ivachevskyy’ в наш словник, а ключ має значення – 80678765432. Тепер маємо книгу, в якій чотири людини:

Таким же ж чином ми можемо переприсвоїти нове значення вже існуючому ключе, а не лише додати новий ключ:

Ми щойно встановили номер Андрію (‘Andriy Ivachevskyy’) в 0, цей ключ у нас уже існував.

Тобто, якщо ключу в словнику присвоїти значення, тоді цей ключ або змінить своє значення у випадку якщо ключ вже існує в словнику, або словник отримає нову пару (ключ-словник), у випадку якщо ключ до цього в словнику не існував.

Додати і змінити значення в словнику вміємо. Тепер ще давайте з вами видалимо пару зі словника. Тут скористаємося тим же ж синтаксисом і оператором, який ми використовували при видалені елементу зі списку ‘del’:

Бачимо зверху, що словник поменшав – значення ‘Andriy Ivachevskyy’ не стало.

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

І на завершення…

Загалом існує багато функцій, яких ми не розглянули у даному уроці, і які ми з вами можемо використовувати у своїх програмах для роботи із списками, кортежами та словниками. Але того, що ми тут розглянули буде більш, ніж достатньо для початку.

Ви молодці, що дійшли до цього моменту! Якщо виникли питання, чи знайшли неточності – коментуйте будь-ласка нижче.

У наступному уроці ми з вами детальніше розглянемо оператор циклу ‘for’. Тому пропоную трохи перепочити, зробити собі чаю чи кави. І аж тоді із свіжими силами приступати до діла.

Сподобалося? Було Корисним? Тоді прошу лайкати і ретвітити, передавати своїм друзям, що також можливо хочуть навчитися основ програмування.

Коментарі:

  1. Доброго вечора.
    Є деякі опечатки:
    – розділ Словники – четвертий приклад:
    на початку рядка символи: “>>>” – вірно: “>>>”;
    – розділ Словники – шостий приклад – рядок 7:
    “діаметер” – вірно: “діаметр”;
    – розділ Словники – шостий приклад – рядок 10:
    “кілька планети” – вірно: “кілька планет”;
    – розділ Словники – шостий приклад – рядок 39:
    “присвоїми” – вірно: “присвоїмо”.

    Відповісти
  2. Добрий день!
    Допоможіть із помилкою при запуску файлу із програмою-приклад на Python 3.6.3 Shell:

    Traceback (most recent call last):
    File “C:\Users\ADMIN\Desktop\dictionary.py”, line 22, in
    if planets.has_key(‘Earth’):
    AttributeError: ‘dict’ object has no attribute ‘has_key’

    Дякую!

    Відповісти
  3. Доброго вечора! Підкажіть будь ласка як зчитати дані з файла .txt у якому містьться числові дані типу float у двох стовпчиках.
    Потрібно потім перший стовпчик записати в один список а другий стовпчик в інший список.
    Приклад даних у файлі:
    -0,00036 3,36
    -0,0153 0.08
    -0,0085 3.33

    Відповісти
  4. Доброго дня!
    Підкажіть будь ласка, чому при використанні методу sort для словників він впорядковується? Хоча не мав би.

    Відповісти
    • питання – для чого ви застосовується операцію сортування на словнику? якщо вам потрібно пробігатись по посортованих ключах словниках – краще зберегти ключі в окремий список. це гарантуватиме що сортування буде завжди однаковим.

  5. у мене переприсвоювання не працює
    >>> book[‘Andriy Ivachevskyy’] = 0
    SyntaxError: invalid syntax

    Python 2.7.5

    підсвічує червоним &

    Відповісти
    • перепрошую
      >>> book[‘Andriy Ivachevskyy’] = 0

    • накінець то зрозумів, друкував ‘>>>’ а тоді переприсвоєння

  6. Привіт!

    Ще з попереднього уроку у мене чомусь не розуміє кирилицю.
    Для початку:
    У мене Вінда 10. Поставив пітона 2.7.11
    Проблема наступна. В коді я вказав # -*- coding: utf-8 -*-
    Але чомусь через cmd(командну строку), воно не розуміє кирилиці.
    Хоча якщо включати через IDLE то там все нормально (тому що попередньо в налаштуваннях я відмітив utf-8)
    Хіба воно не мало б працювати в cmd також?
    А так мені все дуже подобається!)

    Відповісти
    • cmd також потрібно налаштувати, щоб розуміло інші ніж ascii символи (напр. кириличні)

    • З власного маленького досвіду, рекомендую тобі переходити на GNU/Linux – тут все набагато простіше в установці, та й python адекватно працює з консолі.
      Можливо, на початках вивчення python, Linux – як сніг на голову, але потрать тиждень часу, перейди на Ubuntu 14.04, потім не пожалієш.
      З власного досвіду – на Ubuntu Flask піднявся “з коробки” за допомогою 3-х команд, на Windows – бив помилками, а додаткові модулі приходилось прикручувати руцями.

  7. Орфографія: розділ “Словники”, четверта строка першого абзацу: “і навпроти даного ім’я будемо мали її домашній номер телефону”, замість “мали” – “мати”

    Відповісти
  8. Питання відносно коду про планети. В коментах вказано що словник не сортується бо від не впорядкований.Але ми використовуємо sort до keys i values. Я так зрозумів що це є списки котрі входять у словник?

    Відповісти
    • методи keys i values словник віддають нові об’єкти – списки, які вже є впорядкованими множинами.

  9. Дякую за відповіді!

    Відповісти
  10. і ще питаннячко:) чому при друці прізвища виводяться в іншому порядку, а не так як у словнику?

    Відповісти
    • словник – це невпорядкований набір даних. там порядку немає

  11. >>> book[‘Andriy Ivachevskyy’] = 0
    з цим ясно, користувачам видно карлючки > >>

    Відповісти
  12. Доброго дня!
    При запуску коду:
    book = {
    ‘Vitaliy Podoba’: 380322329823,
    ‘Andriy Mylenkyy’: 38044233453,
    ‘Taras Leskiv’: 38032234234,
    }
    book[‘Andriy Ivachevskyy’] = 80678765432
    print book

    видає літеру L після номерів телефонів:
    {‘Andriy Ivachevskyy’: 80678765432L, ‘Andriy Mylenkyy’: 38044233453L, ‘Vitaliy Podoba’: 380322329823L, ‘Taras Leskiv’: 38032234234L}

    а також питання тут: “Таким же ж чином ми можемо переприсвоїти нове значення вже існуючому ключе, а не лише додати новий ключ:
    >>> book[‘Andriy Ivachevskyy’] = 0”
    що це за >>>?

    Відповісти
  13. Запускаю такий код
    x = []

    x.insert(460,4)
    x.insert(461,5)
    x.insert(462,6)
    print x[461]

    Пише помилку

    Traceback (most recent call last):
    File “mary_1.py”, line 15, in
    print x[461]
    IndexError: list index out of range

    Але чому? я ж задав значення 461-го елементу.

    Відповісти
    • не дуже розумію який зміст пробувати вставляти у список 460 елемент якщо він порожні і немає навіть першого. зроби print x і побачив як насправді виглядає він. мабуть 3 елементи. а ти пробуєш 461 елемент витягнути.

  14. Я хочу оголисии три списки, тоді я повинен писати окремо три рядки:

    pirs = []
    n1 = []
    n2 = []

    Чому не можна через кому pirs, n1, n2 = []
    виникає помилка
    File “mary.py”, line 9, in
    pirs, n1, n2 = []
    ValueError: need more than 0 values to unpack

    Тобто, чи можна спростити задання списків?

    Відповісти
    • можна так

      pirs, n1, n2 = [], [], []

      а по-друге, навіть якщо б синтаксис дозволяв робити як ти хочеш, тоді б виникала інша, логічна, помилка. усі змінні вказували б на один список. тобто при додавання елемент до списку n2, списки pirs i n1 також мали б цей елемент.

  15. В цьому рядку коду
    >>> book[‘Andriy Ivachevskyy’] = 0
    що означає >>> ?

    Відповісти
    • А ясно, просто в тексті не праильно вдобразилися >>>

  16. Я правильно розумію, що Списки це масиви,
    Кортежі – масиви констант?
    Не можу знайти аналогу Словника в Pascal, що це може бути там?

    Відповісти
  17. “Також ми можемо взяти підмножину нашого списку кольорів, наприклад з першого по третій. Для цього потрібно скористатися двокрапкою (“:”) :
    colors[0:3] ”

    – мені здається потрібно так: colors[0:2] – 0, 1, 2 – [‘blue’, ‘white’, ‘black’]

    Відповісти
    • Вибачте, був не правий: “…We start at the index before the colon and continue up to but not including the index after the colon.”

  18. В мене запитання до видалення елемента зі списку: після того як один з елементів видалено – інші (наступні) змінюють свій індекс? тобто зміщуються на -1 по порядку? І ще – додавати елемент можна тільки в кінець списку?

    Відповісти
    • список також має метод ‘insert’, з допомогою нього можна вставляти елемент у будь-яку позицію в списку http://www.tutorialspoint.com/python/list_insert.htm

      так, наступні елементи посуваються вліво на одну позицію. важливо уникати видалення елементу зі списку під час його ітерації. детальніше в цій статті:

Опублікувати коментар

Ваша e-mail адреса не оприлюднюватиметься.

Ви не робот? ;) *