Python кортежи и списки: Списки, кортежи и словари в Python
Python. Структуры данных: список, кортеж, множество, словарь
Перевод параграфа 3.6 Data Structures из книги Intermediate Python.
Python содержит встроенные типы данных: списки, кортежи, словари.
Списки
Чтобы создать список используйте квадратные скобки или функцию list()
:
my_list1 = [] # Пустой список
my_list2 = list() # Пустой список
| my_list1 = [] # Пустой список my_list2 = list() # Пустой список |
Список сохраняет порядок элементов с которым создаётся или в котором элементы добавляются. Списки являются последовательностями и поддерживают доступ к элементам по индексу, другие свойства последовательностей будут описаны в следующих главах.
Первый элемент списка находится под индексом 0, последний — на единицу меньше длины списка.
>>> name = [«obi», «ike», «nwosu»]
>>> name[0]
‘obi’
>>> name[1]
‘ike’
>>> name[2]
‘nwosu’
| >>> name = [«obi», «ike», «nwosu»] >>> name[0] ‘obi’ >>> name[1] ‘ike’ >>> name[2] ‘nwosu’ |
Метод append()
добавляет элемент в список.
>>> name = [«obi», «ike», «nwosu»]
>>> name.append(«nkem»)
>>> names
[«obi», «ike», «nwosu», «nkem»]
| >>> name = [«obi», «ike», «nwosu»] >>> name.append(«nkem») >>> names [«obi», «ike», «nwosu», «nkem»] |
Метод insert()
добавляет элемент в любое место списка.
>>> name = [«obi», «ike», «nwosu»]
>>> name.insert(1, «nkem»)
>>> names
[«obi», «nkem», «ike», «nwosu»]
| >>> name = [«obi», «ike», «nwosu»] >>> name.insert(1, «nkem») >>> names [«obi», «nkem», «ike», «nwosu»] |
Оператор +
объединяет два и более списка.
>>> name = [«obi», «ike», «nwosu»]
>>> name1 = [«James»]
>>> name + name1
[«obi», «ike», «nwosu», «James»]
| >>> name = [«obi», «ike», «nwosu»] >>> name1 = [«James»] >>> name + name1 [«obi», «ike», «nwosu», «James»] |
Для просмотра всех методов списка запустите команду help(list)
.
Кортежи
Кортеж тоже является последовательностью и создается элементами разделёнными запятыми:
>>> companies = «Google», «Microsoft», «Tesla»
>>> companies
(‘Google’, ‘Microsoft’, ‘Tesla’)
| >>> companies = «Google», «Microsoft», «Tesla» >>> companies (‘Google’, ‘Microsoft’, ‘Tesla’) |
При определении непустого кортежа скобки не обязательны, но они становятся обязательными когда кортеж является частью большего выражения. Пустой кортеж создаётся пустой парой скобок:
>>> companies = ()
>>> type(companies)
<class ‘tuple’>
| >>> companies = () >>> type(companies) <class ‘tuple’> |
При определении кортежа с одним элементом запятая за ним обязательна.
>>> company = «Google»,
>>> type(company)
<class ‘tuple’>
>>> company = («Google»,)
>>> type(company)
<class ‘tuple’>
| >>> company = «Google», >>> type(company) <class ‘tuple’>
>>> company = («Google»,) >>> type(company) <class ‘tuple’> |
Пропуск запятой означает что задано обычное значение, не кортеж.
>>> company = («Google»)
>>> company
‘Google’
>>> type(company)
<class ‘str’>
| >>> company = («Google») >>> company ‘Google’
>>> type(company) <class ‘str’> |
Кортежи индексируются как списки, но неизменямы.
>>> companies = («Google», «Microsoft», «Palantir»)
>>> companies[0]
‘Google’
>>> companies[0] = «Boeing»
Traceback (most recent call last):
File «<stdin>», line 1, in <module>
TypeError: ‘tuple’ object does not support item assignment
| >>> companies = («Google», «Microsoft», «Palantir») >>> companies[0] ‘Google’ >>> companies[0] = «Boeing» Traceback (most recent call last): File «<stdin>», line 1, in <module> TypeError: ‘tuple’ object does not support item assignment |
В тоже время, если элементом кортежа является изменяемые объект, такой как список, то он может быть изменен.
>>> companies = ([«lockheedMartin», «Boeing»], [«Google», «Microsoft»])
>>> companies
([‘lockheedMartin’, ‘Boeing’], [‘Google’, ‘Microsoft’])
>>> companies[0].append(«SpaceX»)
>>> companies
([‘lockheedMartin’, ‘Boeing’, ‘SpaceX’], [‘Google’, ‘Microsoft’])
| >>> companies = ([«lockheedMartin», «Boeing»], [«Google», «Microsoft»]) >>> companies ([‘lockheedMartin’, ‘Boeing’], [‘Google’, ‘Microsoft’]) >>> companies[0].append(«SpaceX») >>> companies ([ |
Python 3: кортежи (tuple) и операции с ними: len, del, count, index
На этом занятии
мы познакомимся с еще одной коллекцией данных в Python – словарем. В
отличие от списков
Кортеж – это
упорядоченная неизменяемая коллекция произвольных данных.
Для задания
кортежа достаточно перечислить значения через запятую:
или же, это
эквивалентно такой записи:
Чтобы присвоить
только одно значение кортежу, используется такой синтаксис:
b = 1, или b = (1,)
то есть,
последняя запятая указывает, что 1 следует воспринимать как первый элемент
кортежа. Если записать просто 1, то оно будет восприниматься как обычное число.
Если записать
переменные через запятую, то им можно присвоить значения из кортежа:
Но вот так:
уже возникнет
ошибка, т.к. число значений в кортеже меньше числа переменных.
Для определения
длины кортежа (числа его элементов), используется уже знакомая вам функция
Далее, доступ к
элементам кортежа осуществляется также как и к элементам списков:
— по индексу:
— через срезы:
a[1:2] a[0:-1] a[:3] a[1:] a[:]
О срезах мы
подробно говорили, когда рассматривали списки, поэтому не вижу смысла
дублировать здесь эту информацию. Обратите лишь внимание на то, что вот такая
операция
не создает копию кортежа – это будут ссылки на один и тот же кортеж:
увидим одно и то
же значение id.
Если кортежи так
похожи на списки, то в чем их преимущество перед ними? Другими словами: в каких
случаях следует использовать кортеж вместо списка? Во-первых, кортеж – это
неизменяемый тип, то есть, мы в отличие от списков, не можем выполнять такие
операции:
это приведет к
ошибке. Значит, кортеж можно использовать, когда необходимо «запретить»
программисту менять значения элементов списка. Во-вторых, кортежи можно
использовать в качестве ключей у словарей, например, так:
d = {} d[a] = "кортеж"
В-третьих,
кортеж занимает меньше памяти, чем такой же список, например:
lst=[1,2,3] t = (1,2,3) print(lst.__sizeof__()) print(t.__sizeof__())
Как видите,
размер кортежа меньше, чем списка. Здесь использован метод __sizeof__, который
возвращает размер данных в байтах.
И, наконец,
в-четвертых, операции с кортежами выполняются быстрее, чем со списками,
например, перебор элементов или доступ к отдельному элементу.
Отсюда
получается такой один общий, глобальный вывод: если мы работаем с неизменяемым
упорядоченным списком, то предпочтительнее использовать кортеж.
Чтобы создать
пустой кортеж можно использовать такие конструкции:
a = () b = tuple() print(type(a), type(b))
Спрашивается:
зачем создавать пустой кортеж, если он относится к неизменяемым типам. В
действительности, мы лишь не можем менять уже существующие элементы в кортеже,
но можем добавлять новые, используя оператор +:
или для
добавления в начало кортежа:
Также можно
добавить вложенный кортеж:
или делать дубли
в кортеже:
b = (0,)*10 b = ("hello", "world")*5
Все эти операции
вполне допустимы.
Далее, функция tuple позволяет
создавать кортежи на основе любых упорядоченных списков:
a = tuple([1,2,3]) a = tuple("Привет мир")
И обратно, из
кортежа можно сформировать список:
t = (1,2,3) lst = list(t)
Также кортежи
могут хранить самые разные данные:
a = (True, [1,2,3], "hello", 5, {"house": "дом"})
Причем,
смотрите, если обратиться, например, к списку:
то сам по себе
список – это изменяемый тип, следовательно, его значение даже в кортеже мы
можем спокойно менять:
То есть,
неизменяемость кортежа относится к его структуре элементов и переменным
которые ссылаются
на конкретные объекты. Но, если объекты могут изменяться, то это никто не
запрещает делать.
Так как сам
кортеж – неизменяемый объект, то удалить отдельные его элементы невозможно:
но можно удалить
его целиком:
после этого
кортеж a перестанет
существовать.
Методы кортежа
У кортежа
имеется два таких метода:
a = ("abc", 2, [1,2], True, 2, 5) a.count("abc") a.count(2)
который
возвращает число найденных элементов с указанным значением. Если элемент не
найден:
то возвращается
число 0.
Следующий метод:
возвращает
индекс первого найденного элемента с указанным значением. Второй необязательный
параметр
позволяет
задавать индекс начала поиска элемента. В данном случае поиск будет начинаться
с третьего индекса. А последний третий аргумент:
определяет
индекс, до которого идет поиск (не включая его). Если же записать вот так:
то возникнет
ошибка, т.к. в поиск будет включен только 3-й индекс и там нет значения 2.
Задания для самопроверки
1. Дан кортеж:
p =
(«+792345678», «+792345478», «+792355678»,
«+592345678», «+392345678», «+7923456558»)
Нужно вывести
все номера, начинающиеся с «+7».
2. Имеется набор
оценок в виде строки:
«Оценки: 5,
4, 3, 4, 2, 4, 5, 4″
Необходимо
создать кортеж, в котором находились бы только оценки в виде целых чисел:
(5, 4, 3, 4, 2,
4, 5, 4)
3. Вывести
значения кортежа:
((1,2,3),(3,4,5),(6,7,8))
в виде таблицы:
1 – 2 – 3
4 – 5 – 6
7 – 8 – 9
Кортежи | Python
Кортежи очень похожи на списки, так как тоже являются последовательностями ссылок на объекты языка Python, но в отличие от списков они не могут быть изменены. Литералами кортежей являются круглые скобки и что бы создать кортеж достаточно перечислить его элементы через запятую и поместить в ()
:
>>> t = (1, 2, 3, 4)
>>> t
(1, 2, 3, 4)
Чтобы создать пустой кортеж достаточно указать пару пустых круглых скобок:
>>> t = ()
>>> t
()
>>>
>>> type(t)
<class 'tuple'>
Но что бы создать кортеж с одним элементом, после него придется указать запятую:
>>> t = (1,)
>>> t
(1,)
Последний пример показывает, что литералами кортежей являются вовсе не круглые скобки, т.к.:
>>> (1 + 1)
2
А запятые:
>>> 1 + 1,
(2,)
>>>
>>> (1 + 1,)
(2,)
Поэтому, очень часто скобки вообще не используются:
>>> t = 1, 2, 3, 4
>>> t
(1, 2, 3, 4)
Однако, в зависимости от контекста, круглые скобки указывать все же приходится, например, запись вида func(x, y)
будет означать что данной функции передано два аргумента, а запись func((x, y))
будет означать, что функции передан кортеж.
Кортежи могут быть созданы с помощью функции tuple()
. Если вызвать данную функцию без аргументов, то она вернет пустой кортеж:
>>> t = tuple()
>>> t
()
Если передать tuple()
итерируемый объект, то она попытается преобразовать его в кортеж:
>>> tuple('abcd')
('a', 'b', 'c', 'd')
>>>
>>> tuple(range(5))
(0, 1, 2, 3, 4)
>>>
>>> tuple(dict(a=1, b=2, c=3))
('a', 'b', 'c')
Ну а если передать tuple()
кортеж, то будет возвращена его поверхностная копия.
Кортежи не могут быть созданы с помощью генераторов, так как генераторы заключенные в круглые скобки являются «выражениями генераторами»
>>> (i**2 for i in range(10))
<generator object <genexpr> at 0x013DC680>
Поскольку кортежи являются последовательностями, то они поддерживают оператор извлечения среза [START:STOP:STEP]
(и индексируются так же как и списки), так же они поддерживают оператор проверки на вхождение in
и not in
, функцию измерения размера (длины) len()
, а так же механиз итерирования с помощью конструкции for... in...
.
Неизменяемость кортежей
Кортежи, в отлие от списков являются неизменяемыми:
>>> l = [0, 1, 2]
>>> l[0] = 111
>>> l
[111, 1, 2]
>>>
>>>
>>> t = (1, 2, 3)
>>> t[0] = 111
TypeError: 'tuple' object does not support item assignment
Но так же как и строки, они могут служить «сырьем» для новых объектов:
>>> t
(1, 2, 3)
>>>
>>> t = (111,) + t[1:]
>>> t
(111, 2, 3)
>>>
>>>
>>> t = t[0:1] + (222,) + t[2:]
>>> t
(111, 222, 3)
С другой стороны, что бы быстро поменять кортеж, его можно сначала преобразовать в список, изменить, а затем снова преобразовать в кортеж:
>>> t = list(t)
>>> t[2] = 333
>>> t = tuple(t)
>>> t
(111, 222, 333)
Однако, кортеж является неизменяемым только до тех пор пока сам состоит из неизменяемых объектов:
>>> t = (1, 2, [3, 4])
>>>
>>> t[2][1] = 4444
>>>
>>> t
(1, 2, [3, 4444])
Именно по этой причине, кортежи иногда не могут быть ключами словарей и элементами множеств.
Так как кортежи являются неизменяемыми, то они имеют всего два метода: .count(x)
и .index(x)
.
Распаковка и упаковка кортежей
Кортежи (и списки) могут учавствовать в операциях присваивания:
>>> a, b, c = 1, 2, 3
>>> a, b, c
(1, 2, 3)
Данный механизм очень удобен для обмена значениями между переменными:
>>> a, b, c = c, b, a
>>> a, b, c
(3, 2, 1)
Если слева от оператора =
элементов меньше чем справа, то можно воспользоваться оператором *
для указания элементу которому может быть присвоено более одного значения:
>>> *a, b, c = (1, 2, 3, 4)
>>> a, b, c
([1, 2], 3, 4)
>>>
>>> a, *b, c = (1, 2, 3, 4)
>>> a, b, c
(1, [2, 3], 4)
>>>
>>> a, b, *c = (1, 2, 3, 4)
>>> a, b, c
(1, 2, [3, 4])
Использование помеченных *
переменных, так же позволяет указывать слева от =
больше элементов чем справа:
>>> *a, b, c, d, e = (1, 2, 3, 4)
>>> a, b, c, d
([], 1, 2, 3)
>>>
>>> a, b, *c, d, e = (1, 2, 3, 4)
>>> a, b, c, d
(1, 2, [], 3)
Процесс упвковки кортежей, позволяет связываеть воедино разные переменные:
>>> a, b, c, x, y, z = 1, 2, 3, 4, 5, 6
>>>
>>> t1 = a, x
>>>
>>> t2 = x, c, z, b
>>>
>>> t1
(1, 4)
>>>
>>> t2
(4, 3, 6, 2)
Механизм распаковки кортежей может использоваться в конструкциях for... in...
:
>>> for x, y in ((1, 2), (1, 3), (1, 4)):
... print(x, '+', y, '=', x + y)
...
1 + 2 = 3
1 + 3 = 4
1 + 4 = 5
Это может быть очень удобно при работе с некоторыми генераторами:
>>> for x, y in zip('abcd', range(1, 5)):
... print(x*y)
...
a
bb
ccc
dddd
Именованные кортежи
Кортежи являются коллекциями и могут хранить абсолютно любые объекты языка Python, включая другие кортежи. Если использовать много вложенных кортежей, то легко возникает путаница с индексами элементов и работа с такими кортежами теряет осмысленность:
>>> t = (('mod_1', 8.71, (-1.32, 23.87)), ('mod_2', 5.12, (-0.41, 19.86)))
>>> t
(('mod_1', 8.71, (-1.32, 23.87)), ('mod_2', 5.12, (-0.41, 19.86)))
С одной стороны, можно смириться с этим и пользоваться обычными целочисленными индексами:
>>> t[0][2][1]
23.87
С другой стороны, можно попытаться придать индексам какие-то осмысленные обозначения:
>>> model_1, model_2 = 0, 1
>>> name, mean, min_max = 0, 1, 2
>>> minimum, maximum = 0, 1
Теперь обращение к элементам t
может выглядеть чуть логичнее:
>>> t[model_1][min_max][maximum]
23.87
Но самый простой способ это использование встроенного модуля collections
из стандартной библиотеки. Благодаря ему «очень легко» создать структуру кортежа из примера выше:
>>> import collections
>>>
>>> models = collections.namedtuple('models', 'model_1 model_2')
>>> params = collections.namedtuple('params', 'name mean min_max')
>>> limit = collections.namedtuple('limit', 'minimum maximum')
Потом, точно также «очень легко» создать сам именованный кортеж:
>>> Models = models(params('mod_1', 8.71, limit(-1.32, 23.87)),
... params('mod_2', 5.12, limit(-0.41, 19.86)))
А вот извлекать элементы из такого кортежа, действительно легко:
>>> Models.model_1.min_max.maximum
23.87
Зачем же может понадобиться такая сложная штука? Дело в том, что иногда, вечером вы можете не понять код, который написали утром. Комментарии, строки документирования, и любые другие возможности, включая именованные кортежи призваны сделать ваш код легким для понимания. Да, постучать по клавиатуре, придется чуть дольше, но это лучше и не так обидно, чем начинать все сначала, после того как спустя неделю смысл кода окончательно забылся.
Python | Преобразовать список кортежей в список списка
Это довольно простая проблема, но может иметь большое применение из-за определенных ограничений языка Python. Поскольку кортежи являются неизменяемыми, их нелегко обрабатывать, тогда как списки всегда являются лучшим вариантом при обработке. Давайте обсудим некоторые способы, которыми мы можем преобразовать список кортежей в список списка.
Метод № 1: Использование понимания списка
Это может быть легко достигнуто с помощью понимания списка. Мы просто перебираем каждый список, преобразовывая кортежи в список.
|
Выход :
The original list of tuples : [(1, 2), (3, 4), (5, 6)] The converted list of list : [[1, 2], [3, 4], [5, 6]]
Способ № 2: Использование map()
+ list
Мы можем использовать комбинацию функции карты и оператора списка для выполнения этой конкретной задачи. Функция map связывает каждый кортеж и преобразует его в список.
|
Выход :
The original list of tuples : [(1, 2), (3, 4), (5, 6)] The converted list of list : [[1, 2], [3, 4], [5, 6]]
Рекомендуемые посты:
Python | Преобразовать список кортежей в список списка
0.00 (0%) 0 votes
Python | Кортежи
Кортежи
Последнее обновление: 26.04.2017
Кортеж (tuple) представляет последовательность элементов, которая во многом похожа на список за тем исключением, что кортеж является неизменяемым
(immutable) типом. Поэтому мы не можем добавлять или удалять элементы в кортеже, изменять его.
Для создания кортежа используются круглые скобки, в которые помещаются его значения, разделенные запятыми:
user = ("Tom", 23) print(user)
Также для определения кортежа мы можем просто перечислить значения через запятую без применения скобок:
user = "Tom", 23 print(user)
Если вдруг кортеж состоит из одного элемента, то после единственного элемента кортежа необходимо поставить запятую:
user = ("Tom",)
Для создания кортежа из списка можно передать список в функцию tuple(), которая возвратит кортеж:
users_list = ["Tom", "Bob", "Kate"] users_tuple = tuple(users_list) print(users_tuple) # ("Tom", "Bob", "Kate")
Обращение к элементам в кортеже происходит также, как и в списке по индексу. Индексация начинается также с нуля при получении элементов с начала списка и с -1 при получении элементов с конца списка:
users = ("Tom", "Bob", "Sam", "Kate") print(users[0]) # Tom print(users[2]) # Sam print(users[-1]) # Kate # получим часть кортежа со 2 элемента по 4 print(users[1:4]) # ("Bob", "Sam", "Kate")
Но так как кортеж — неизменяемый тип (immutable), то мы не сможем изменить его элементы. То есть следующая запись работать не будет:
users[1] = "Tim"
При необходимости мы можем разложить кортеж на отдельные переменные:
user = ("Tom", 22, False) name, age, isMarried = user print(name) # Tom print(age) # 22 print(isMarried) # False
Особенно удобно использовать кортежи, когда необходимо возвратить из функции сразу несколько значений. Когда функция возвращает несколько значений, фактически она возвращает в кортеж:
def get_user(): name = "Tom" age = 22 is_married = False return name, age, is_married user = get_user() print(user[0]) # Tom print(user[1]) # 22 print(user[2]) # False
С помощью встроенной функции len() можно получить длину кортежа:
user = ("Tom", 22, False) print(len(user)) # 3
Перебор кортежей
Для перебора кортежа можно использовать стандартные циклы for и while. С помощью цикла for:
user = ("Tom", 22, False) for item in user: print(item)
С помощью цикла while:
user = ("Tom", 22, False) i = 0 while i < len(user): print(user[i]) i += 1
Как для списка с помощью выражения элемент in кортеж
можно проверить наличие элемента в кортеже:
user = ("Tom", 22, False) name = "Tom" if name in user: print("Пользователя зовут Tom") else: print("Пользователь имеет другое имя")
Сложные кортежи
Один кортеж может содержать другие кортежи в виде элементов. Например:
countries = ( ("Germany", 80.2, (("Berlin",3.326), ("Hamburg", 1.718))), ("France", 66, (("Paris", 2.2),("Marsel", 1.6))) ) for country in countries: countryName, countryPopulation, cities = country print("\nCountry: {} population: {}".format(countryName, countryPopulation)) for city in cities: cityName, cityPopulation = city print("City: {} population: {}".format(cityName, cityPopulation))
Здесь кортеж countries, который представляет страны, состоит из кортежей, каждый из которых — отдельная страна.
Вложенные кортежи имеют три элемента: название страны, численность ее населения и города. Города представляют отдельный кортеж, где каждый отдельный город — это вложенный кортеж,
содержащий название города и численность его населения.
Python. Кортежи. Свойства кортежей. Создание кортежа. Примеры
Содержание
Поиск на других ресурсах:
1. Понятие кортежа. Примеры. Необходимость применения кортежей
В языке Python кортеж – это группа объектов разных типов, взятых в круглые скобки которая не допускает изменения (есть неизменяемой). Кортежи имеют много свойств. С кортежами можно применять различные операции.
Согласно документации Python, общая форма описания класса кортежа следующая:
class tuple([iterable])
где iterable – некоторая последовательность объектов.
Кортежи необходимы в случаях, когда нужно использовать фиксированные наборы объектов. Одним из примеров может быть использование кортежей в качестве ключей к элементам словарей (ключе нельзя изменять). Также использование кортежей есть важным, когда в задаче нужно обеспечить поддержку целостности, то есть кортеж не может быть изменен из другой ссылки.
Если в задаче нужно использовать коллекции объектов, которые могут быть изменены, то для этих случаев нужно использовать списки.
Примеры кортежей.
() # пустой кортеж (2.3,'ABCDE', False) # кортеж из 3-х элементов разных типов ('world', (2.88, "bestprog"), 3.141592) # вложенный кортеж (3.88, 2,) # Кортеж из двух элементов
⇑
2. Свойства кортежей
Для кортежей выделяют следующие свойства:
- 1. Кортежи – это упорядоченные коллекции объектов произвольных типов. Коллекции объектов упорядочены слева направо.
- 2. В кортежах доступ к элементам обеспечивается по смещению. Кортежи поддерживают операции, которые используются по смещению элементов, например, вытягивание среза, индексирование и т.п..
- 3. Кортежи относятся к категории неизменяемых последовательностей. К кортежам невозможно применить операции непосредственного изменения. Однако, если элементом кортежа есть изменяемый элемент (например список), то этот элемент можно изменять в кортеже.
- 4. Кортежи гетерогенны. Термин «гетерогенный» означает, что кортежи могут содержать другие составные объекты, например, списки, строки или другие кортежи.
- 5. Кортежи поддерживают произвольное количество вложений.
- 6. Кортежи имеют фиксированную длину. Если нужно изменить длину кортежа, то при этом обязательно создается копия кортежа в новом месте памяти, длина которой иная.
- 7. Кортежи можно представлять как массивы ссылок на объекты.
⇑
3. Отличия между кортежами и списками
Между кортежами и списками можно выделить следующие отличия:
- кортеж формируется в круглых скобках (), список формируется в квадратных скобках [];
- кортежи относятся к неизменяемым последовательностям, списки относятся к изменяемым последовательностям. К кортежам невозможно применить операции, которые непосредственно их изменяют. К спискам такие операции применять можно;
- кортежи имеют фиксированную длину (количество элементов), списки имеют переменную длину. Если нужно увеличить размер кортежа, то нужно создать копию.
⇑
4. Что есть общего между кортежами и списками?
Между кортежами и списками можно выделить следующие общие особенности:
- Списки и кортежи являются коллекциями объектов или последовательностями.
- Списки и кортежи обеспечивают приведение в порядок своих объектов слева направо.
- Кортежи и списки могут содержать элементы (объекты) любого типа.
- В кортежах и списках доступ к элементам осуществляется по смещению.
- Кортежи и списки поддерживают одинаковые операции, основанные на использовании смещения. Например, индексирование, получение среза и т.п.
- Кортежи и списки есть гетерогенными. Это значит, что кортежи и списки могут содержать другие составные элементы (строки, списки, кортежи).
- Кортежи и списки поддерживают произвольное количество вложений.
- Кортежи и списки позволяют сохранять массивы ссылок на другие сложные объекты, которые, в свою очередь также могут быть кортежами, списками или строками.
⇑
5. Способы (операции) создания кортежа
Создать кортеж можно одним из 4 способов приведенных ниже.
1. С помощью пары пустых скобок ().
В этом случае создается пустой кортеж. Например
() # создается пустой кортеж
2. В случае одиночного кортежа с помощью запятой в конце элемента, взятого в круглые скобки.
Например.
(2,) (True, )
3. С помощью использования нескольких элементов разделенных запятой и взятых в круглые скобки.
Например.
(2.5, -11, 3) (a, True, "Tuples")
4. С помощью встроенной функции tuple().
Например.
# Создание вложенных кортежей с помощью операции = a = (2.5, -11, 3) b = (a, True, "Tuples") # b = ((2.5, -11, 3), True, 'Tuples') c = tuple(b) # c = ((2.5, -11, 3), True, 'Tuples')
⇑
6. Пример создания кортежа, содержащего целые случайные числа
# Создать кортеж из последовательности 5 целых чисел, # которые лежат в диапазоне от 0 до 10. # Для использования случайных чисел нужно # подключить модуль random import random # 1. Создать список из чисел lst = [] # сначала пустой список i = 0 while i < 5: num = random.randint(0,10) lst = lst + [num] i = i+1 # 2. Создать кортеж из элементов списка a = tuple(lst) print("a = ", a) # a = (3, 0, 2, 6, 2)
Результат работы программы
a = (4, 1, 4, 5, 7)
⇑
7. Пример поиска заданного элемента в кортеже
# Поиск заданного элемента в кортеже # 1. Заданный кортеж из строк a = ('ab', 'abcd', 'cde', 'abc', 'def') # 2. Ввод искомой строки s = str(input("s = ")) # 3. Цикл обхода кортежа result = False # результат i = 0 while i < len(a): # len(a) - количество элементов в кортеже if (a[i]==s): result = True break i = i+1 if (result): print("Yes") else: print("No")
⇑
8. Функция len(). Количество элементов в кортеже
Для определения длины кортежа (количество элементов в кортеже) используется стандартная функция len().
Пример.
# Функция len() - количество элементов в кортеже a = () # пустой кортеж l = len(a) # l = 0 b = (1, 3, 7, 13, 'abc', True) l = len(b) # l = 6 # Вложенный кортеж c = (a, b, "Hello", 2.33) l = len(c) # l = 4
⇑
9. Представление кортежей с одним элементом
Чтобы указать, что объект есть кортежем, нужно после элемента указать символ ‘ , ‘ (запятая). В противном случае объект будет восприниматься как число.
Например.
# Отличие между объектом, взятым в скобки () и кортежем. # Число num1 имеющее значение 255 num1 = (255) num2 = num1 + 5 # num2 = 255 + 5 = 260 - суммирование обычных целых чисел # Кортеж содержащий число 255 - в конце указывается запятая A = (255,) # B = A + 5 - запрещено, исключительная ситуация
⇑
Связанные темы
⇑
Кортежи. Урок 20 курса «Python. Введение в программирование»
Кортежи (tuple) в Python – это те же списки за одним исключением. Кортежи неизменяемые структуры данных. Так же как списки они могут состоять из элементов разных типов, перечисленных через запятую. Кортежи заключаются в круглые, а не квадратные скобки.
>>> a = (10, 2.13, "square", 89, 'C') >>> a (10, 2.13, 'square', 89, 'C')
Из кортежа можно извлекать элементы и брать срезы:
>>> a[3] 89 >>> a[1:3] (2.13, 'square')
Однако изменять его элементы нельзя:
>>> a[0] = 11 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment
Также у типа tuple нет методов для добавления и удаления элементов.
Возникает резонный вопрос. Зачем в язык программирования был введен этот тип данных, по-сути представляющий собой неизменяемый список? Дело в том, что иногда надо защитить список от изменений. Преобразовать же кортеж в список, если это потребуется, как и выполнить обратную операцию легко с помощью встроенных в Python функций list() и tuple():
>>> a = (10, 2.13, "square", 89, 'C') >>> b = [1, 2, 3] >>> c = list(a) >>> d = tuple(b) >>> c [10, 2.13, 'square', 89, 'C'] >>> d (1, 2, 3)
Рассмотрим случай, когда уместно использовать кортежи. В Python изменяемые объекты передаются в функцию по ссылке. Это значит, что не создается копия объекта, а переменной-параметру присваивается ссылка на уже существующий объект. В итоге, если в теле функции объект изменяется, то эти изменения касаются глобального объекта.
def addNum(seq, num): for i in range(len(seq)): seq[i] += num return seq origin = [3, 6, 2, 6] changed = addNum(origin, 3) print(origin) print(changed)
Данная программа неправильная. Хотя никаких выбросов исключений не произойдет, она содержит логическую ошибку. На выводе получаем:
[6, 9, 5, 9] [6, 9, 5, 9]
То есть исходный список был также изменен. Параметр seq содержал ссылку не на свой локальный список, а на список-оригинал. Таким образом, в операторе return здесь нет смыла. Если функция замысливалась как изменяющая глобальный список, то программа должна выглядеть так:
def addNum(seq, num): for i in range(len(seq)): seq[i] += num origin = [3, 6, 2, 6] addNum(origin, 3) print(origin)
Что делать, если все же требуется не изменять исходный список, а сформировать по нему новый. Задачу можно решить несколькими способами. Во первых, в функции можно создать локальный список, после чего возвращать его:
def addNum(seq, num): new_seq = [] for i in seq: new_seq.append(i + num) return new_seq origin = [3, 6, 2, 6] changed = addNum(origin, 3) print(origin) print(changed)
Результат:
[3, 6, 2, 6] [6, 9, 5, 9]
Исходный список в функции не меняется. Его элементы лишь перебираются.
Второй способ защитить список-оригинал – использовать кортеж. Этот способ более надежный, так как в больших программах трудно отследить, что ни одна функция не содержит команд изменения глобальных данных.
Хотя преобразовывать к кортежу можно как при передаче в функцию, так и в самой функции, лучше сразу делать глобальный список кортежем. Поскольку неизменяемые объекты передаются по значению, а не по ссылке, то в функцию будет поступать копия структуры, а не оригинал. Даже если туда передается оригинал, изменить его невозможно. Можно лишь, как вариант, скопировать его и/или изменить тип, создав тем самым локальную структуру, и делать с ней все, что заблагорассудится.
def addNum(seq, num): seq = list(seq) for i in range(len(seq)): seq[i] += num return seq origin = (3, 6, 2, 6) changed = addNum(origin, 3) print(origin) print(changed)
Списки в кортежах
Кортежи могут содержать списки, также как списки быть вложенными в другие списки.
>>> nested = (1, "do", ["param", 10, 20])
Как вы думаете, можем ли мы изменить список [«param», 10, 20] вложенный в кортеж nested? Список изменяем, кортеж – нет. Если вам кажется, что нельзя, то вам кажется неправильно. На самом деле можно:
>>> nested[2][1] = 15 >>> nested (1, 'do', ['param', 15, 20])
Примечание. Выражения типа nested[2][1]
используются для обращения к вложенным объектам. Первый индекс указывает на позицию вложенного объекта, второй – индекс элемента внутри вложенного объекта. Так в данном случае сам список внутри кортежа имеет индекс 2, а элемент списка 10 – индекс 1 в списке.
Странная ситуация. Кортеж неизменяем, но мы все-таки можем изменить его. На самом деле кортеж остается неизменяемым. Просто в нем содержится не сам список, а ссылка на него. Ее изменить нельзя. Но менять сам список можно.
Чтобы было проще понять, перепишем кортеж так:
>>> l = ["param", 10, 20] >>> t = (1, "do", l) >>> t (1, 'do', ['param', 10, 20])
Кортеж содержит переменную-ссылку. Поменять ее на другую ссылку нельзя. Но кортеж не содержит самого списка. Поэтому его можно менять как угодно:
>>> l.pop(0) 'param' >>> t (1, 'do', [10, 20])
Однако помните, такой номер не прокатывает с неизменяемыми типами:
>>> a = "Kat" >>> t = (a, l) >>> t ('Kat', [10, 20]) >>> a = "Bat" >>> t ('Kat', [10, 20])
Они передаются в кортеж как и в функцию – по значению. Т. е. их значение копируется в момент передачи.
Практическая работа
Чтобы избежать изменения исходного списка, не обязательно использовать кортеж. Можно создать его копию с помощью метода списка copy() или взять срез от начала до конца [:]. Скопируйте список первым и вторым способом и убедитесь, что изменение копий никак не отражается на оригинале.
Заполните один кортеж десятью случайными целыми числами от 0 до 5 включительно. Также заполните второй кортеж числами от -5 до 0. Для заполнения кортежей числами напишите одну функцию. Объедините два кортежа с помощью оператора +, создав тем самым третий кортеж. С помощью метода кортежа count() определите в нем количество нулей. Выведите на экран третий кортеж и количество нулей в нем.
Примеры решения и дополнительные уроки в android-приложении и pdf-версии курса
кортежей Python и списки — сравнение списков и кортежей
1. Кортежи Python и списки — цель
В наших предыдущих руководствах по Python мы видели кортежи в Python и списки в Python. Оба представляют собой разнородные коллекции объектов Python. Но какой выбрать, когда нужно хранить коллекцию? Чтобы ответить на этот вопрос, мы сначала немного углубимся в две конструкции, а затем изучим сравнение кортежей Python и списков.
Итак, приступим к уроку Python Tuples vs Lists Tutorial.
Кортежи Python и списки — Сравнение списков и кортежей
2. Редакция кортежей в Python
Перед тем, как сравнивать кортежи и списки, мы должны пересмотреть их. Сначала мы смотрим на кортеж.
Кортеж — это набор значений, который мы объявляем с помощью круглых скобок. Однако мы также можем использовать упаковку кортежей, чтобы сделать то же самое, и распаковку, чтобы присвоить его значения последовательности переменных.
>>> числа = (1,2, 'три') >>> числа = 4,5,6 >>> a, b, c = числа >>> print (числа, a, b, c, введите (числа))
(4, 5, 6) 4 5 6 <класс "кортеж">
Кортеж возвращается, когда мы вызываем метод localtime ().
>>> время импорта >>> time.localtime ()
time.struct_time (tm_year = 2018, tm_mon = 1, tm_mday = 1, tm_hour = 23, tm_min = 1, tm_sec = 59, tm_wday = 0, tm_yday = 1, tm_isdst = 0)
Для доступа к кортежу мы используем индексирование, которое начинается с 0.
>>> числа [1]
5
Мы также можем разрезать его, чтобы получить его часть.
>>> числа [: - 1]
(4, 5)
Наконец, мы можем удалить весь кортеж.
>>> дель чисел >>> номера
Traceback (последний звонок последний):
Файл «
номера
NameError: имя «числа» не определено
Мы также изучили некоторые функции и методы для кортежей и списков. Вы должны прочитать наши руководства по ним, чтобы получить больше информации.
3. Пересмотр списков в Python
В отличие от C ++, в Python нет массивов для работы.Вместо этого у нас есть список.
Мы составляем списки, используя квадратные скобки.
>>> colors = ['красный', 'синий', 'зеленый']
Списки тоже можно разрезать.
>>> цвета [-2:]
[«синий», «зеленый»]
Затем мы узнали, как переназначить и удалить их.
>>> цвета [0] = 'розовый' >>> цвета
[«розовый», «синий», «зеленый»]
>>> дель цветов [0] >>> цвета [0]
«синий»
>>> дель цветов >>> цвета
Traceback (последний звонок последний):
Файл «
цвета
NameError: имя «colors» не определено
Теперь, когда мы освежили наши воспоминания, мы можем перейти к различию между кортежами python и списками.
4. Кортежи Python и списки — Мутабельность
Основное различие между кортежами и списками состоит в том, что список изменяемый, тогда как кортеж неизменен. Это означает, что список можно изменить, но нельзя изменить кортеж.
а. Список изменяемый
Давайте сначала посмотрим списки. Для примера возьмем новый список.
>>> список1 = [0,1,2,3,4,5,6,7]
Теперь сначала мы попробуем переназначить элемент списка. Давайте назначим второму элементу значение 3.
>>> список1 [1] = 3 >>> list1
[0, 3, 2, 3, 4, 5, 6, 7]
Опять же, давайте посмотрим, как переназначить весь список.
>>> список1 = [7,6,5,4,3,2,1,0] >>> list1
[7, 6, 5, 4, 3, 2, 1, 0]
Это сработало, отлично.
Теперь мы удалим только один элемент из списка.
>>> список1 [1] >>> list1
[7, 5, 4, 3, 2, 1, 0]
Это было легко, но можно ли удалить часть списка? Давай попробуем.
>>> del list1 [3:] >>> list1
[7, 5, 4]
Таким же образом мы можем получить доступ к фрагменту. Можем ли мы переназначить срез?
>>> число = [1,2,3,4,5] >>> число [1: 3] = [6,7,8] >>> числа
[1, 6, 7, 8, 4, 5]
Действительно, можем. Наконец, давайте попробуем удалить весь список.
>>> del list1 >>> list1
Traceback (последний звонок последний):
Файл «
список1
NameError: имя list1 не определено
Списка больше не существует.
г. Кортеж неизменяем
А теперь попробуем проделать то же самое с кортежем. Мы знаем, что кортеж неизменяем, поэтому некоторые из этих операций не должны работать. Для этого возьмем новый кортеж.
>>> mytuple = 0,1,2,3,4,5,6,7
Сначала попробуем переназначить второй элемент.
>>> mytuple [1] = 3
Traceback (последний звонок последний):
Файл «
mytuple [1] = 3
TypeError: объект «кортеж» не поддерживает присвоение элемента
Как видите, кортеж не поддерживает назначение элементов.
Однако мы можем переназначить весь кортеж.
>>> mytuple = 2,3,4,5,6 >>> mytuple
(2, 3, 4, 5, 6)
Затем давайте попробуем разрезать кортеж, чтобы получить к нему доступ или удалить.
>>> mytuple [3:]
(5, 6)
>>> del mytuple [3:]
Traceback (последний звонок последний):
Файл «
del mytuple [3:]
TypeError: объект «кортеж» не поддерживает удаление элемента
Как видно, мы можем разрезать его, чтобы получить к нему доступ, но мы не можем удалить часть.Это потому, что он неизменен.
Можно ли удалить отдельный элемент?
>>> del mytuple [3]
Traceback (последний звонок последний):
Файл «
del mytuple [3]
TypeError: объект «кортеж» не поддерживает удаление элемента
По всей видимости, нет.
Наконец, давайте попробуем удалить весь кортеж.
>>> del mytuple >>> mytuple
Traceback (последний звонок последний):
Файл «
mytuple
NameError: имя mytuple не определено
Итак, здесь мы делаем вывод, что вы можете разрезать кортеж, переназначить его целиком или удалить целиком.
Но вы не можете удалить или переназначить только несколько элементов или фрагмент.
Давайте рассмотрим больше различий между кортежами Python и списками.
5. Функции
Некоторые функции python применимы к обоим: arelen (), max (), min (), sum (), any (), all (), sorted (). Мы рассмотрим только один пример для обоих контейнеров.
>>> макс ((1,3, -1))
3
>>> макс ([1,3, -1])
3
6. Методы
Списки и кортежи используют методы index () и count ().Но кроме них, есть несколько методов, применимых к спискам. Это append (), insert (), remove (), pop (), clear (), sort () и reverse (). Давайте возьмем один из них.
>>> [1,3,2] .index (3)
1
>>> (1,3,2) .index (3)
1
Чтобы получить представление обо всех этих методах и функциях, которые мы упоминали, вам следует обратиться к нашим статьям о списках и кортежах.
7. Кортежи в списке
Мы можем хранить кортежи в списке, когда захотим.
>>> mylist = [(1,2,3), (4,5,6)] >>> введите (мой список)
<список "класса">
>>> тип (mylist [1])
Но когда нам это нужно делать? Возьмем пример.
[(1, «ABC»), (2, «DEF»), (3, «GHI»)]
8. Списки в кортеже
Точно так же мы можем использовать кортеж для хранения списков. Посмотрим как.
>>> mytuple = ([1,2], [3,4], [5,6])
9. Вложенные кортежи
Кортеж может содержать больше кортежей, и это может происходить более чем в двух измерениях.
>>> mytuple = ((1,2), (3, (4,5), (6, (7, (8,9)))))
Чтобы получить доступ к элементу со значением 8, мы пишем следующий код.
>>> mytuple [1] [2] [1] [1] [0]
8
10. Вложенные списки
Точно так же список может содержать больше списков в любом количестве измерений.
>>> mylist = [[1,2], [3,4]] >>> myotherlist = [[1,2], [3, [4,5]]]
Чтобы получить доступ к элементу со значением 5, мы пишем следующий код.
>>> myotherlist [1] [1] [1]
5
11. Когда использовать
Используйте кортеж, когда вы знаете, какая информация находится в контейнере. Например, если вы хотите сохранить учетные данные человека для своего веб-сайта.
>>> person = ('ABC', 'admin', '12345')
Но если вы хотите хранить похожие элементы, например, в массиве в C ++, вам следует использовать список.
>>> бакалея = ['хлеб', 'масло', 'сыр']
Обратите внимание, что это не означает, что список может содержать только однородные значения.Кроме того, вы не можете использовать список в качестве ключа для словаря. Это связано с тем, что хешируются только неизменяемые значения. Следовательно, мы можем устанавливать в качестве ключей только неизменяемые значения, такие как кортежи. Но если вы все еще хотите использовать список в качестве ключа, вы должны сначала превратить его в кортеж.
Итак, это все о Python Tuples vs Lists. Надеюсь, вам понравится наше объяснение.
12. Заключение
Теперь, когда мы знаем различия между кортежами Python и списками, выбор между ними не должен быть очень сложным.Основное отличие состоит в том, что список можно изменять, а кортеж — нет. Итак, мы используем список, когда хотим содержать похожие элементы, но используем кортеж, когда знаем, какая информация в него входит.
Как вы думаете? Напишите нам в комментариях.
Номер ссылки
.
Список Python против кортежей (с примерами)
Списки и кортежи хранят один или несколько объектов или значений в определенном порядке. Объекты, хранящиеся в списке или кортеже, могут быть любого типа, включая тип ничего, определенный ключевым словом None.
Списки и кортежи
похожи в большинстве случаев, но есть некоторые различия, которые мы собираемся найти в этой статье.
Различия синтаксиса
Синтаксис списка и кортежа немного отличается. Списки заключаются в квадратные скобки []
, а кортежи заключаются в круглые скобки ()
.
Пример 1.1: Создание списка и создание кортежа
list_num = [1,2,3,4]
tup_num = (1,2,3,4)
печать (list_num)
печать (tup_num)
Выход:
[1,2,3,4] (1,2,3,4)
Выше мы определили переменную с именем list_num , которая содержит список чисел от 1
до 4
. Список заключен в квадратные скобки []
. Также мы определили переменную tup_num ; который содержит набор чисел от 1
до 4
.Кортеж заключен в круглые скобки ()
.
В python у нас есть функция type ()
, которая дает тип созданного объекта.
Пример 1.2: Найти тип структуры данных с помощью функции type ()
тип (list_num)
тип (tup_num)
Выход:
Список кортеж
Изменяемый список против неизменяемых кортежей
Список имеет изменяемую природу, то есть список может быть изменен или модифицирован после его создания в соответствии с потребностями, тогда как кортеж имеет неизменяемую природу i.е., кортеж нельзя изменить или модифицировать после его создания.
Пример 2.1: изменение списка элементов и кортежа
list_num [2] = 5
печать (list_num)
tup_num [2] = 5
Выход:
[1,2,5,4] Traceback (последний вызов последний): Файл "python", строка 6, вTypeError: объект 'tuple' не поддерживает присвоение элемента
В приведенном выше коде мы присвоили 5
list_num с индексом 2
и нашли 5
с индексом 2
на выходе.Кроме того, мы присвоили 5
tup_num с индексом 2
и получили ошибку типа
. Мы не можем изменить кортеж из-за его неизменности.
Примечание. Поскольку кортежи неизменны, они имеют фиксированный размер, а размер списка — переменный.
Доступные операции
Lists имеет больше встроенных функций, чем кортеж. Мы можем использовать встроенную функцию dir ([object])
, чтобы получить все связанные функции для списка и кортежа.
Пример 3.1: Список каталога
каталог (list_num)
Выход:
['__add__', '__учебный класс__', '__содержит__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__формат__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__я добавить__', '__imul__', '__в этом__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__размер__', '__str__', '__subclasshook__', 'добавить', 'Чисто', 'копия', 'считать', 'продлить', 'индекс', 'вставить', 'поп', 'Удалить', 'обеспечить регресс', 'sort']
Пример 3.2: Каталог кортежей
директория (tup_num)
Выход:
['__add__', '__учебный класс__', '__содержит__', '__delattr__', '__dir__', '__doc__', '__eq__', '__формат__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__в этом__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__размер__', '__str__', '__subclasshook__', 'считать', 'index']
Мы ясно видим, что существует так много дополнительных функций, связанных со списком над кортежем.Мы можем выполнять операции вставки и извлечения, удаления и сортировки элементов в списке с помощью встроенных функций, которые недоступны в Tuple.
Сравнение размеров
Операция с кортежами имеет меньший размер, чем у списка, что делает ее немного быстрее, но не о чем упоминать, пока у вас не будет огромного количества элементов.
Пример 5.1: Расчет размера списка и кортежа
а = (1,2,3,4,5,6,7,8,9,0)
b = [1,2,3,4,5,6,7,8,9,0]
print ('a =', a .__ sizeof __ ())
print ('b =', b.__sizeof __ ())
Выход:
а = 104 б = 120
В приведенном выше коде у нас есть кортеж a и список b с такими же элементами, но размер кортежа меньше, чем список.
Различные варианты использования
На первый взгляд может показаться, что списки всегда могут заменять кортежи. Но кортежи — это чрезвычайно полезные структуры данных
- Использование кортежа вместо списка может дать программисту и интерпретатору подсказку, что данные не должны изменяться.
- Кортежи обычно используются как эквивалент словаря без ключей для хранения данных. Например,
[(«Рыба-меч», «Доминик Сена», 2001 г.), («Сноуден», «Оливер Стоун», 2016 г.), («Таксист», «Мартин Скорсезе», 1976 г.)]
В приведенном выше примере содержатся кортежи внутри списка, в котором есть список фильмов.
- Чтение данных упрощается, если кортежи хранятся внутри списка. Например,
[(2,4), (5,7), (3,8), (5,9)]
легче читать чем
[[2,4], [5,7], [3,8], [5,9]]
Кортеж также может использоваться в качестве ключа в словаре из-за их хешируемой и неизменяемой природы, тогда как списки не используются в качестве ключа в словаре, потому что список не может обрабатывать __hash __ ()
и имеет изменяемую природу.
key_val = {('alpha', 'bravo'): 123} # Действительно
key_val = {['alpha', 'bravo']: 123} # Неверно
Ключевые моменты, которые следует запомнить:
- Литеральный синтаксис кортежей показан круглыми скобками
()
, тогда как буквальный синтаксис списков показан квадратными скобками[]
. - Списки имеют переменную длину, кортеж — фиксированную длину.
- Список имеет изменяемую природу, кортеж неизменен.
- Список имеет больше функций, чем кортеж.
.
Python: разница между списками и кортежами
Итак, вы только что узнали о списках и кортежах, и вам интересно, чем они отличаются?
Это удивительно частый вопрос.
Они оба ведут себя очень похоже.
И списки, и кортежи являются типами данных последовательности, которые могут хранить коллекцию элементов.
Каждый элемент, хранящийся в списке или кортеже, может иметь любой тип данных.
И вы также можете получить доступ к любому элементу по его индексу.
Вопрос в том, разные ли они вообще?
А если нет, то почему у нас есть два типа данных, которые ведут себя примерно одинаково?
Разве мы не можем жить со списками или кортежами?
Что ж, попробуем найти ответ.
Ключевое различие между списком и кортежем
Основное различие между списками и кортежами состоит в том, что списки являются изменяемыми , тогда как кортежи неизменяемыми .
Что это вообще значит, скажете вы?
Изменяемый тип данных означает, что объект python этого типа может быть изменен.
Неизменяемый объект не может.
Давайте посмотрим, что это означает в действии.
Давайте создадим список и назначим его переменной.
>>> a = ["яблоки", "бананы", "апельсины"]
Теперь давайте посмотрим, что происходит, когда мы пытаемся изменить первый элемент списка.
Заменим «яблоки» на «ягоды».
>>> a [0] = "ягоды"
>>> а
[«ягоды», «бананы», «апельсины»]
Отлично! изменился первый элемент.
А что, если мы хотим попробовать то же самое с кортежем вместо списка? Давайте посмотрим.
>>> a = ("яблоки", "бананы", "апельсины")
>>> a [0] = "ягоды"
Отслеживание (последний вызов последний):
Файл "", строка 1, в
TypeError: объект "кортеж" не поддерживает назначение элементов.
. Мы получаем сообщение об ошибке, указывающее, что объект кортежа не поддерживает назначение элементов.
Причина, по которой мы получаем эту ошибку, заключается в том, что объекты кортежа, в отличие от списков, неизменяемы, что означает, что вы не можете изменять объект кортежа после его создания.
Но вы можете подумать, Карим, мой друг, я знаю, вы говорите, что не можете выполнять задания так, как вы их написали, но как насчет этого, разве следующий код не изменяет a?
>>> a = ("яблоки", "бананы", "апельсины")
>>> a = ("ягоды", "бананы", "апельсины")
>>> а
(«ягоды», «бананы», «апельсины»)
Справедливый вопрос!
Давайте посмотрим, действительно ли мы модифицируем первый элемент в кортеже a с помощью приведенного выше кода?
Ответ: Нет, , абсолютно нет.
Чтобы понять, почему, вы сначала должны понять разницу между переменной и объектом Python.
Разница между переменной и объектом
Вы, вероятно, путаете переменные с объектами. Это очень распространенное заблуждение среди новичков.
Помните, что переменная — это не что иное, как ссылка на фактический объект python в памяти.
Сама переменная не является объектом.
Например, давайте попробуем визуализировать, что происходит, когда вы назначаете список переменной a.
>>> a = ["яблоки", "бананы", "апельсины"]
При этом в памяти создается объект python типа list, а переменная a ссылается на этот объект с помощью хранит свое местоположение в памяти .
Фактически, вы можете фактически получить местоположение объекта списка в памяти, проверив a с помощью функции id ().
>>> a = ["яблоки", "бананы", "апельсины"]
>>> id (а)
4340729544
Теперь, если вы измените первый индекс списка и снова проверите id (), вы получите такое же точное значение, потому что a по-прежнему ссылается на тот же объект.
>>> a [0] = "ягоды"
>>> id (а)
4340729544
На следующем рисунке показано, что именно произошло после модификации.
Теперь посмотрим, что произойдет, если мы проделаем то же самое с кортежами.
>>> a = ("яблоки", "бананы", "апельсины")
>>> id (а)
4340765824
>>> a = ("ягоды", "бананы", "апельсины")
>>> id (а)
4340765464
Как видите, эти два адреса разные.
Это означает, что после второго присвоения a ссылается на совершенно новый объект.
На этом рисунке показано, что именно произошло.
Более того, если никакие другие переменные в вашей программе не ссылаются на старый кортеж, тогда сборщик мусора python полностью удалит старый кортеж из памяти.
Итак, концепция изменчивости — ключевое различие между списками и кортежами.
Изменчивость — это не просто концепция Python, это концепция языка программирования, с которой вы столкнетесь в различных языках программирования.
Но теперь, может быть, вся эта дискуссия вызывает в вашей голове еще один вопрос.
Почему у нас есть изменяемые и неизменяемые объекты?
Зачем нужны изменяемые и неизменяемые объекты?
На самом деле, они оба служат разным целям.
Давайте обсудим некоторые аспекты, которые различают изменяемые и неизменяемые объекты /
1. Добавление производительности
Изменяемость более эффективна, когда вы знаете, что будете часто изменять объект.
Например, предположим, что у вас есть некоторый итерируемый объект (скажем, x), и вы хотите добавить каждый элемент x в список.
Конечно, вы можете просто выполнить L = list (x), но под капотом это преобразуется в цикл, который выглядит следующим образом:
L = []
для элемента в x:
L.append (item)
Это работает нормально. Вы продолжаете изменять объект списка на месте до тех пор, пока все элементы x не появятся в списке L.
Но можете ли вы даже представить, что произошло бы, если бы вместо этого мы использовали кортеж?
Т = ()
для элемента в x:
T = T + (item,)
Можете ли вы представить себе, что происходит в памяти?
Поскольку кортежи неизменяемы, вы в основном копируете содержимое кортежа T в новый объект кортежа на КАЖДОЙ итерации .
Если цикл for большой, это огромная проблема производительности.
На самом деле, давайте использовать python для измерения производительности добавления в список по сравнению с добавлением в кортеж, когда x = range (10000).
В этой статье рассказывается, как использовать модуль timeit для измерения времени выполнения нескольких строк Python.
$ python3 -m timeit \
-s "L = []" \
-s "x = диапазон (10000)" \
"для элемента в x:" "L.append (элемент)"
1000 циклов, лучшее из 3: 1,08 мс на цикл
Cool, 1.08 миллисекунды .
А что, если мы сделаем то же самое с кортежами?
$ python3 -m timeit \
-s "T = ()" -s "x = диапазон (10000)" \
"для элемента в x:" "T = T + (элемент,)"
10 циклов, лучшее из 3: 1,63 секунды на цикл
Колоссальные 1,63 секунды !
Это огромная разница в производительности между списками и кортежами.
Если вы хотите проверить свое терпение, попробуйте x = range (1000000).
Теперь, когда кто-то говорит вам, что многократное добавление к объекту string неэффективно, вы поймете, почему именно (строковые объекты также неизменяемы в python).
Дополнительная производительность: Победы по изменчивости!
2. Простота отладки
Изменяемость — это круто, и все, кроме одной вещи, которая может действительно раздражать изменяемые объекты, — это отладка.
Что я имею в виду?
Давайте посмотрим на этот очень простой пример.
>>> a = [1, 3, 5, 7]
>>> б = а
>>> b [0] = -10
>>> а
[-10, 3, 5, 7]
Обратите внимание, что когда мы делаем b = a, мы не копируем объект списка из b в a.
Фактически мы говорим python, что две переменные a и b должны ссылаться на один и тот же объект списка.
Поскольку a эффективно удерживает местоположение объекта Python в памяти, когда вы говорите b = a, вы копируете это адресное место (не фактический объект) в b.
Это приводит к наличию двух ссылок (a и b) на один и тот же объект списка.
Другими словами, когда мы делаем b [0] = -10, это имеет тот же эффект, что и a [0] = -10.
Конечно, вы можете посмотреть на код и справедливо подумать, что его легко отлаживать.
Что ж, вы правы для небольших фрагментов кода, подобных этому, но представьте, что у вас есть большой проект со множеством ссылок на один и тот же изменяемый объект.
Отследить все изменения этого объекта будет очень сложно, потому что любое изменение любой из этих ссылок приведет к изменению объекта.
Это не относится к неизменяемым объектам, даже если у вас есть несколько ссылок на них.
После создания неизменяемого объекта его содержимое никогда не изменится.
Легкость отладки: Побеждает неизменность!
3.Эффективность памяти
Еще одно преимущество неизменяемости состоит в том, что она позволяет реализации языка более эффективно использовать память.
Позвольте мне объяснить, что я имею в виду под этим.
В CPython (наиболее популярная реализация Python), если вы создаете неизменяемые объекты, содержащие одно и то же значение, python (при определенных условиях) может объединять эти разные объекты в один.
Например, взгляните на этот код:
>>> a = "Karim"
>>> b = "Карим"
>>> id (а)
4364823608
>>> id (b)
4364823608
Помните, что строки (а также целые числа, числа с плавающей запятой и логические значения) также являются примерами неизменяемых объектов.
Как видите, хотя в нашей программе на python мы явно создали два разных строковых объекта, python внутренне объединил их в один.
Откуда мы это узнали?
Ну, потому что идентичность a в точности такая же, как идентичность b.
Python смог это сделать, потому что неизменность строк делает безопасным выполнение этого связывания.
Это не только сэкономит нам память (не сохраняя строку несколько раз в памяти), но и каждый раз, когда вы захотите создать новый объект с тем же значением, python просто создаст ссылку на объект, который уже существует в памяти, что определенно более эффективно.
Эта концепция называется String Interning, и это отличная статья, если вы хотите углубиться в нее.
Не только струны. Это также относится к целым числам (при определенных условиях).
>>> а = 1
>>> b = 1
>>> id (а)
4305324416
>>> id (b)
4305324416
Круто, не правда ли?
А как насчет кортежей?
CPython до тех пор, пока python 3.6 не примет дизайнерское решение не связывать автоматически два эквивалентных кортежа в один.
>>> a = (1, 2)
>>> b = (1, 2)
>>> id (а)
4364806856
>>> id (b)
4364806920
Как видите, идентификатор a отличается от идентификатора b.
Это проектное решение имеет смысл, потому что для выполнения интернирования кортежей необходимо убедиться, что все элементы кортежа сами по себе неизменны.
Эффективность памяти: Побеждает неизменность
Заключение
Чтобы понять разницу между списками Python и кортежами, вы должны сначала понять концепцию изменчивости / неизменяемости.
Списки — это изменяемые объекты, что означает, что вы можете изменять объект списка после его создания.
Кортежи, с другой стороны, являются неизменяемыми объектами, что означает, что вы не можете изменять объект кортежа после его создания.
И изменчивость, и неизменность имеют свои преимущества и недостатки.
Изучение Python?
Загляните в раздел Курсы!
Избранные сообщения
Вы начинаете свою карьеру в области программирования?
Я предлагаю свои лучшие материалы для новичков в информационном бюллетене.
- Советы по Python для начинающих, среднего и продвинутого уровней.
- CS Советы и рекомендации по карьере.
- Специальные скидки на мои премиальные курсы при их запуске.
И многое другое…
Подпишитесь сейчас. Это бесплатно.
.
списков кортежей Python — DZone с открытым исходным кодом
В этом посте мы поговорим о создании списков кортежей Python и о том, как их можно использовать.
Списки Python
Списки в Python — это просто массив. Вот основной список моих любимых классов WoW:
awesomeList = ['паладин', 'мошенник', 'священник', 'воин', 'друид']
Списки создаются с помощью скобок []
Мы можем добавить что-то в конец нашего списка с помощью append ()
:
В [6]: awesomeList.append ("чернокнижник")
В [7]: awesomeList
Out [7]: ['паладин', 'мошенник', 'священник', 'воин', 'друид', 'чернокнижник']
Элементы в списке имеют индекс, начинающийся с 0, который называется смещением. Таким образом, мы можем ссылаться на конкретные элементы в нашем списке следующим образом:
В [7]: awesomeList
Out [7]: ['паладин', 'мошенник', 'священник', 'воин', 'друид', 'чернокнижник']
В [8]: awesomeList [0]
Out [8]: 'паладин'
В [9]: awesomeList [3]
Out [9]: 'воин'
Измените элементы, используя также смещение:
В [10]: awesomeList [3] = "монах"
В [11]: awesomeList
Out [11]: ['паладин', 'мошенник', 'священник', 'монах', 'друид', 'чернокнижник']
Наконец, вы можете удалить элементы из списка с помощью remove ()
:
В [12]: awesomeList.удалить ('монах')
В [13]: awesomeList
Out [13]: ['паладин', 'мошенник', 'священник', 'друид', 'чернокнижник']
Есть еще несколько списков, но этого должно быть достаточно для целей этой публикации. Вы можете узнать больше из справочной документации Python, если хотите. Вперед до кортежей:
Кортежи Python
Кортежи очень похожи на списки, но кортежи неизменяемы. Это означает, что после их создания вы не можете их изменить.
Давайте создадим кортеж из того же списка классов WoW выше.
В [14]: awesomeTuple = ('паладин', 'мошенник', 'священник', 'воин', 'друид')
В [15]: awesomeTuple
Out [15]: ('паладин', 'мошенник', 'священник', 'воин', 'друид')
С помощью кортежей мы можем «распаковать» значения следующим образом:
В [16]: belkas, gorkin, landril, maxilum, ferral = awesomeTuple
В [17]: белкас
Out [17]: 'паладин'
В [18]: максилум
Out [18]: 'воин'
Вы также можете создать кортеж из списка.
В [20]: кортеж (awesomeList)
Out [20]: ('паладин', 'мошенник', 'священник', 'друид', 'чернокнижник')
Ознакомьтесь со справочной документацией Python для получения дополнительной информации о кортежах.
Теперь, когда у нас есть хорошее введение в списки и кортежи Python, мы можем перейти к сути этого руководства.
Python Списки кортежей
Мы можем создавать списки кортежей. Это отлично подходит для работы с такими вещами, как файлы журналов.
Допустим, мы проанализировали файл журнала и получили код состояния и сообщение из веб-журнала Apache2.
Затем мы могли бы представить эти данные с помощью списков кортежей Python. Вот слишком упрощенный пример:
В [21]: журналы = [
...: ('HTTP_OK', 'ПОЛУЧИТЬ /index.html'),
...: ('HTTP_NOT_FOUND', 'ПОЛУЧИТЬ /index.htmll')
...:]
Это позволяет нам выполнять довольно интересные операции, например подсчитывать количество ошибок.
В [29]: errorCount = 0
...: для входа в журналы:
...: статус, сообщение = журнал
...: если статус не HTTP_OK:
...: errorCount + = 1
...:
В [30]: errorCount
Вых [30]: 1
Зачем использовать кортежи вместо списков? Кортежи занимают меньше места для одного.Используя приведенный выше пример для анализа файла журнала, если файл журнала большой, то использование кортежей уменьшает объем используемой памяти.
Надеюсь, вам понравилась эта статья.
.