Python Tuple vs List: сходства и различия, объяснение

Опубликовано: 2022-08-08

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

Список и кортежи являются встроенными структурами данных в Python. Их можно использовать для хранения набора элементов.

От поддержки индексации и нарезки до содержания разнородных типов данных кортежи и списки могут иметь сходную функциональность. Поэтому понимание сходств и различий между ними может помочь вам решить, какую структуру данных использовать.

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

Вы можете запустить Python REPL и следовать этому руководству. Вы также можете использовать онлайн-редактор Python от Geekflare для написания кода.

Кортеж Python против списка: в чем сходство?

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

python-tuple-vs-list

# 1 . Итерации Python

В 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(sequence) . Ячейка кода ниже показывает, как вы можете это сделать.

 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

Вы можете использовать нарезку, когда хотите работать с небольшой частью списка или кортежа. list[start:end] возвращает фрагмент списка, начинающийся с начала индекса и расширяющийся до конца — 1. Значение по умолчанию для начала равно 0, а конец — это последний элемент в итерируемом объекте.

Вы можете нарезать кортежи, используя тот же синтаксис. Давайте создадим срезы списка и кортежа, которые мы создали ранее.

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

В дополнение к начальному и конечному значениям вы также можете указать значение шага. tuple(start:end:step) возвращает фрагмент кортежа от start до end - 1 с шагом step .

 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 .

Элемент выражения item in iterable оценивается как True , если iterable содержит item ; иначе False .

 "Alex" in student_list # False "Jane" in student_tuple # True

Итак, вы узнали сходство между списками и кортежами в Python. Далее давайте изучим ключевые различия между двумя структурами данных.

Python Tuple и список: в чем разница?

# 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 . Размер в памяти

Теперь мы будем опираться на то, что узнали в предыдущем разделе: список — это структура данных переменной длины .

Когда вы изначально определяете список, для него выделяется определенный размер в памяти. Теперь, когда вы изменяете список с помощью методов append() или extend() , для хранения добавленных элементов должна быть выделена дополнительная память. Это распределение почти всегда делается больше, чем количество элементов, которые вы добавляете.

Поэтому необходимо отслеживать количество элементов в списке и выделенное пространство. Кроме того, поскольку списки имеют переменную длину, имеется указатель, указывающий на адрес элементов списка. В результате списки длины k занимают больше памяти, чем кортеж с теми же k элементами.

Вот простая иллюстрация.

python-tuple-vs-list-size

Вы можете использовать метод 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?

Из различий и сходств между списками и кортежами Python вы знаете, что если вам нужна изменяемая коллекция, вы должны использовать список .

Но когда вместо этого следует использовать кортеж?

Мы рассмотрим это в этом разделе.

# 1 . Коллекция только для чтения

Всякий раз, когда вы хотите, чтобы коллекция была неизменной, вы должны определить ее как кортеж. Предположим color = (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) — перед созданием словаря.

Что теперь происходит с ключом словаря «А»?

Если вы попытаетесь создать словарь из 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 . Аргументы функции

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

Рассмотрим следующую функцию find_volume() , которая возвращает объем прямоугольного параллелепипеда с заданными размерами: длиной, шириной и высотой.

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

Предположим, что эти измерения доступны в списке с именем dimensions . Вызов find_volume() с dimensions в качестве аргумента возвращает объем.

 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) и длину этого списка.

Давайте установим значение num 20 и вызовем функцию.

 num = 20

Вызов return_even() возвращает два значения в кортеже. Вы можете вызвать функцию type() с вызовом функции в качестве аргумента проверки.

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

Вы можете распечатать возвращаемое значение, чтобы убедиться, что это кортеж, содержащий список четных чисел в качестве первого элемента и длину списка в качестве второго элемента.

 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. Приятного обучения! тогда удачного кодирования!