Python Tuple проти List: Подібності та відмінності, пояснення

У цьому посібнику ви дізнаєтесь про схожість і відмінності між кортежами та списками Python. Ви також зрозумієте, коли слід використовувати кортеж.

Список і кортежі є вбудованими структурами даних у Python. Їх можна використовувати для зберігання колекції елементів.

Від підтримки індексування та нарізки до вмісту різнорідних типів даних, кортежі та списки можуть здаватися подібними. Тому розуміння подібностей і відмінностей між ними може допомогти вам вирішити, яку структуру даних використовувати.

Давайте почнемо.

👩🏽‍💻 Ви можете запустити Python REPL і дотримуватися цього посібника. Ви також можете використовувати онлайн-редактор Python від techukraine.net для кодування.

Python Tuple проти List: у чому схожість?

Давайте почнемо з вивчення подібності між списками та кортежами. Щоб полегшити навчання, ми наводимо приклади як списків, так і кортежів.

#1. Python Iterables

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

Вони обидва ітеровані; тому ви можете прокручувати їх за допомогою циклу for.

Комірка коду нижче показує, як перебирати список.

nums = [2,6,7,10]
print(f"Type of nums is {type(nums)}")
for num in nums:
  print(num)

# Output
Type of nums is <class 'list'>
2
6
7
10

Як пояснюється нижче, ви також можете перебирати кортеж за допомогою циклу

nums = (2,6,7,10)

# Note: nums = 2,6,7,10 is a valid tuple as well. If needed, run a quick check!

print(f"Type of nums is {type(nums)}")
for num in nums:
  print(num)

# Output
Type of nums is <class 'tuple'>
2
6
7
10

#2. Підтримка створення з інших послідовностей

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

sample_str = "Coding!"

Наступна комірка коду показує, як list(string) повертає список, елементи списку якого є символами в рядку.

list_from_str = list(sample_str)
print(list_from_str)

# Output
['C', 'o', 'd', 'i', 'n', 'g', '!']

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

tuple_from_str = tuple(sample_str)
print(tuple_from_str)

# Output
('C', 'o', 'd', 'i', 'n', 'g', '!')

#3. Підтримка індексування та нарізки

Python підтримує нульове індексування, коли перший елемент має нульовий індекс, другий — один і так далі. Python також підтримує негативне індексування, де останній елемент має індекс -1, передостанній елемент має індекс -2 і так далі.

list_from_str = ['C', 'o', 'd', 'i', 'n', 'g', '!']
print(list_from_str[1])
# o

Елемент під індексом -2 є передостаннім елементом, ‘g’.

tuple_from_str = ('C', 'o', 'd', 'i', 'n', 'g', '!')
print(tuple_from_str[-2])
# g

Ви можете використовувати нарізку, коли хочете працювати з невеликою частиною списку або кортежу. список[start:end] повертає фрагмент списку, починаючи з початку індексу й закінчуючи кінцем – 1. Значення за замовчуванням для початку дорівнює 0, а кінець є останнім елементом ітерованого елемента.

  Як скасувати онлайн-підписку Nintendo Switch

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

list_from_str = ['C', 'o', 'd', 'i', 'n', 'g', '!']
print(list_from_str[0:5])

['C', 'o', 'd', 'i', 'n']

Окрім початкового та кінцевого значень, ви також можете вказати значення кроку. tuple(start:end:step) повертає фрагмент кортежу від початку до кінця – 1, з кроком.

tuple_from_str = ('C', 'o', 'd', 'i', 'n', 'g', '!')
print(tuple_from_str[::2])

('C', 'd', 'n', '!')

Тут ми встановлюємо значення кроку рівним 2. Таким чином, фрагмент містить кожен другий елемент.

#4. Колекції даних кількох типів

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

Однак ви можете зберігати значення різних типів даних в одному списку або кортежі.

Фрагмент коду нижче student_list містить ім’я студента як рядок, вік як ціле число та оцінки, захищені як число з плаваючою точкою.

student_list = ["John",22,96.5]
for item in student_list:
  print(f"{item} is of type {type(item)}")

# Output
John is of type <class 'str'>
22 is of type <class 'int'>
96.5 is of type <class 'float'>

Ми можемо придумати подібний приклад для кортежу.

student_tuple = ("Jane",23,99.5)
for item in student_tuple:
  print(f"{item} is of type {type(item)}")

# Output
Jane is of type <class 'str'>
23 is of type <class 'int'>
99.5 is of type <class 'float'>

#5. Підтримка тестування членства

Як списки, так і кортежі дозволяють виконувати перевірку членства на наявність певних елементів. Якщо ви хочете перевірити, чи присутній певний елемент у списку або кортежі, ви можете використовувати оператор in.

Елемент виразу в iterable має значення True, якщо iterable містить елемент; інакше, False.

"Alex" in student_list
# False

"Jane" in student_tuple
# True

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

Python Tuple проти List: які відмінності?

#1. Змінність списків і незмінність кортежів у Python

Найбільш важливою відмінністю між списком і кортежем у Python є те, що кортеж незмінний. Це означає, що ви не можете змінити кортеж на місці.

▶️ Ось приклад.

tuple1 = ("Java","Python","C++")
tuple1[0] = "Rust"

# Output
----> 2 tuple1[0] = "Rust"

TypeError: 'tuple' object does not support item assignment

Список — це змінна структура даних, тому ми можемо змінювати список, змінюючи елемент у певному індексі, як у наступній комірці коду.

list1 = ["Java","Python","C++"]
list1[0] = "Rust"
print(list1)

# Output
['Rust', 'Python', 'C++']

#2. Списки змінної довжини проти кортежів фіксованої довжини

Список Python — це структура даних змінної довжини.

Ви можете зробити наступне:

  • Додайте елемент у кінець списку
  • Додайте елементи з іншого списку в кінець поточного списку
  • Видалити зі списку елементи за певним індексом
list1 = [2,3,4,5]

# add an item to the end
list1.append(9)
print(list1)

# add items from list2 to the end of list1
list2 = [0,7]
list1.extend(list2)
print(list1)

# remove an item from list1
list1.pop(0)
print(list1)

▶️ Результат наведеного вище фрагмента коду.

# Output
[2, 3, 4, 5, 9]
[2, 3, 4, 5, 9, 0, 7]
[3, 4, 5, 9, 0, 7]

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

tuple1 = (2,4,6,8)
tuple1 = (1,8,9)
print(tuple1)

# Output
(1, 8, 9)

#3. Розмір в пам’яті

Тепер ми будемо спиратися на те, що дізналися в попередньому розділі: список є структурою даних змінної довжини.

  Як вимкнути (і увімкнути) JavaScript в Google Chrome

Коли ви спочатку визначаєте список, для нього в пам’яті виділяється певний розмір. Тепер, коли ви змінюєте список за допомогою методів append() або extend(), потрібно виділити додаткову пам’ять для зберігання доданих елементів. Цей розподіл майже завжди виконується більше, ніж кількість елементів, які ви додаєте.

Тому необхідно відстежувати кількість елементів у списку та виділений простір. Крім того, оскільки списки мають змінну довжину, існує покажчик, який вказує на адресу елементів списку. Як наслідок, списки довжини k займають більше пам’яті, ніж кортеж із такими самими k елементами.

Ось проста ілюстрація.

Ви можете використовувати метод getsizeof() вбудованого модуля sys для об’єкта Python, щоб отримати розмір об’єкта в пам’яті.

import sys

list1 = [4,5,9,14]
list_size = sys.getsizeof(list1)
print(f"Size of list:{list_size}")

tuple1 = (4,5,9,14)
tuple_size = sys.getsizeof(tuple1)
print(f"Size of tuple:{tuple_size}")

Список займає більше пам’яті, ніж кортеж, для тієї ж кількості та значення елементів, як підтверджено в наведених нижче результатах.

# Output
Size of list:104
Size of tuple:88

Коли слід використовувати кортеж Python?

З відмінностей і подібностей між списками та кортежами Python ви знаєте, що якщо вам потрібна змінна колекція, вам слід використовувати список.

Але коли замість цього слід використовувати кортеж?

Ми розглянемо це в цьому розділі.

#1. Колекція лише для читання

Щоразу, коли ви хочете, щоб колекція була незмінною, ви повинні визначити її як кортеж. Припустимо, колір = (243,55,103) кортеж, що містить значення RGB, що відповідають відтінку кольору. Визначення кольору як кортежу гарантує, що його неможливо змінити.

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

#2. Ключі до словника

Наприклад, ви створюєте словник, використовуючи елементи списку key_list як ключі. Ви можете використовувати метод dict.fromkeys(), щоб створити словник зі списку.

key_list = list("ABCD")
dict.fromkeys(key_list)

{'A': None, 'B': None, 'C': None, 'D': None}

Припустімо, ви змінюєте список, щоб містити «D» як перший елемент (індекс 0)—перед створенням словника.

Тепер, що станеться зі словниковим ключем «A»?

Якщо ви спробуєте створити словник із key_list і отримати доступ до значення, що відповідає ключу «A», ви зіткнетеся з KeyError.

key_list[0] = 'D'

dict.fromkeys(key_list)['A']

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-31-c90392acc2cf> in <module>()
----> 1 dict.fromkeys(key_list)['A']

KeyError: 'A'

Ключі словника повинні бути унікальними. Отже, у вас не може бути друге «D» як ключ.

dict.fromkeys(key_list)
{'B': None, 'C': None, 'D': None} # A is no longer a key.

Якщо натомість ви використовуєте кортеж, така модифікація неможлива, і у вас менше шансів зіткнутися з помилками. Тому вам слід віддати перевагу створенню словника, використовуючи елементи кортежу як ключі.

key_tuple = tuple("ABCD")
dict.fromkeys(key_tuple)
{'A': None, 'B': None, 'C': None, 'D': None}

key_tuple[0] = 'D'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-2cecbefa7db2> in <module>()
----> 1 key_tuple[0] = 'D'

TypeError: 'tuple' object does not support item assignment

#3. Аргументи функції

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

  Позбавтеся від Australis і відновіть класичну тему у Firefox 29

Розглянемо наступну функцію find_volume(), яка повертає об’єм паралелепіпеда за розмірами: довжина, ширина та висота.

def find_volume(dimensions):
  l,b,h = dimensions
  return l*b*h

Припустімо, що ці розміри доступні в списку, що називається розмірами. Виклик find_volume() із розмірами як аргумент повертає обсяг.

dimensions = [2,8,5]
find_volume(dimensions)
80

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

dimensions = [20,8,5]
find_volume(dimensions)
800

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

#4. Значення, що повертаються функціями

У Python ви зустрінете кортежі у значеннях, що повертаються функціями. Коли ви повертаєте кілька значень із функції, Python неявно повертає їх як кортеж.

Розглянемо таку функцію return_even():

def return_even(num):
  even = [i for i in range(num) if (i%2==0)]
  return even,len(even)
  • Він приймає число num як аргумент
  • Він повертає список парних чисел в інтервалі [0,num) and the length of that list.

Let’s set the value of num 20 and call the function.

num = 20

Calling return_even() returns the two values in a tuple. You can call the type() function with the function call as the verification argument.

type(return_even(num)) # <class 'tuple'>

You can print out the return value to verify that it’s a tuple containing the list of even numbers as the first item and the length of the list as the second item.

print(return_even(num))
([0, 2, 4, 6, 8, 10, 12, 14, 16, 18]10)

Оскільки в кортежі є два елементи, ви можете розпакувати їх у дві змінні, як показано нижче.

even_nums, count = return_even(num)

print(even_nums)
print(count)

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
10

Висновок

Я сподіваюся, що цей підручник надав вичерпне порівняння кортежу Python зі списком.

Давайте завершимо підручник коротким підсумком:

  • Список і кортежі є вбудованими структурами даних у Python.
  • Подібності: ітерації, підтримка індексування, нарізки, різні типи даних і оператор для перевірки членства.
  • Ключова відмінність: списки змінні, а кортежі незмінні.
  • Інші відмінності: фіксована довжина кортежів і змінна довжина списків, менший розмір пам’яті кортежів.
  • Коли слід використовувати кортеж? Для незмінних колекцій, ключів словника та аргументів функцій.

Далі перегляньте проекти Python, щоб потренуватися та навчитися. Або дізнайтеся про методи видалення повторюваних елементів зі списків Python. Щасливого навчання! тоді, щасливого кодування!👩🏽‍💻