Кортежи
Кортежи (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 "", line 1, in 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 add_num(seq, num): for i in range(len(seq)): seq[i] += num return seq origin = [3, 6, 2, 6] changed = add_num(origin, 3) print(origin) print(changed)
Данная программа неправильная. Хотя никаких выбросов исключений не произойдет, она содержит логическую ошибку. На выводе получаем:
[6, 9, 5, 9] [6, 9, 5, 9]
То есть исходный список был также изменен. Параметр seq содержал ссылку не на свой локальный список, а на список-оригинал. Таким образом, в операторе return здесь нет смыла. Если функция замысливалась как изменяющая глобальный список, то программа должна выглядеть так:
def add_num(seq, num): for i in range(len(seq)): seq[i] += num origin = [3, 6, 2, 6] add_num(origin, 3) print(origin)
Что делать, если все же требуется не изменять исходный список, а сформировать по нему новый. Задачу можно решить несколькими способами. Во первых, в функции можно создать локальный список, после чего возвращать его:
def add_num(seq, num): new_seq = [] for i in seq: new_seq.append(i + num) return new_seq origin = [3, 6, 2, 6] changed = add_num(origin, 3) print(origin) print(changed)
[3, 6, 2, 6] [6, 9, 5, 9]
Исходный список в функции не меняется. Его элементы лишь перебираются.
Второй способ защитить список-оригинал – использовать кортеж. Этот способ более надежный, так как в больших программах трудно отследить, что ни одна функция не содержит команд изменения глобальных данных.
Хотя преобразовывать к кортежу можно как при передаче в функцию, так и в самой функции, лучше сразу делать глобальный список кортежем. Поскольку неизменяемые объекты передаются по значению, а не по ссылке, то в функцию будет поступать копия структуры, а не оригинал. Даже если туда передается оригинал, изменить его невозможно. Можно лишь, как вариант, скопировать его и/или изменить тип, создав тем самым локальную структуру, и делать с ней все, что заблагорассудится.
def add_num(seq, num): seq = list(seq) for i in range(len(seq)): seq[i] += num return seq origin = (3, 6, 2, 6) changed = add_num(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() определите в нем количество нулей. Выведите на экран третий кортеж и количество нулей в нем.
Примеры решения и дополнительные уроки в pdf-версии курса
X Скрыть Наверх
Python. Введение в программирование
Как преобразовать кортеж с несколькими элементами в одну строку?
Подскажите пожалуйста известен ли вам более простой способ?
- Вопрос задан более трёх лет назад
- 5343 просмотра
Комментировать
Решения вопроса 1
Ну вот так например:
flatten = [str(item) for sub in tuple for item in sub]
Или можно itertools использовать:
import itertools flatten = [str(item) for item in itertools.chain(*tuple)]
А потом сделать join:
«».join(flatten)
Преобразование кортежа в строку в Python
В этом посте мы обсудим, как преобразовать кортеж в строку Python.
1. Использование join() функция
Идея состоит в том, чтобы использовать встроенную функцию str.join , который возвращает конкатенацию строк в итерируемом объекте.
if __name__ == ‘__main__’ :
tup = ( ‘A’ , ‘B’ , ‘C’ )
s = » . join ( tup )
print ( s ) # ABC
Если вам нужна строка, разделенная запятыми, или строка, разделенная другим разделителем, вы можете использовать следующий код:
if __name__ == ‘__main__’ :
tup = ( ‘A’ , ‘B’ , ‘C’ )
s = delim . join ( tup )
print ( s ) # A,B,C
Это повысит TypeError для любых нестроковых значений в кортеже. Например, происходит сбой, если кортеж содержит числа. Чтобы справиться с этим, вы можете использовать map функция:
if __name__ == ‘__main__’ :
tup = ( 1 , 2 , 3 )
s = » . join ( map ( str , tup ) )
print ( s ) # 123
2. Использование операции уменьшения
Другой вариант — выполнить операцию редукции с помощью functools.reduce функция.
from functools import reduce
if __name__ == ‘__main__’ :
tup = ( ‘A’ , ‘B’ , ‘C’ )
s = reduce ( lambda x , y : x + y , tup , » )
print ( s ) # ABC
Это повысит TypeError для любых нестроковых значений в кортеже. Чтобы справиться с этим, вы можете использовать конструктор строк:
from functools import reduce
if __name__ == ‘__main__’ :
tup = ( 1 , 2 , 3 )
s = reduce ( lambda x , y : str ( x ) + str ( y ) , tup , » )
print ( s ) # 123
Вот и все о преобразовании кортежа в строку Python.
Оценить этот пост
Средний рейтинг 5 /5. Подсчет голосов: 23
Голосов пока нет! Будьте первым, кто оценит этот пост.
Сожалеем, что этот пост не оказался для вас полезным!
Расскажите, как мы можем улучшить этот пост?
Спасибо за чтение.
Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.
Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂
Подписывайся
0 Комментарии
Встроенные отзывы
Просмотреть все комментарии
Загрузить больше комментариев
Просматривать
Подпишитесь на новые публикации
- Все проблемы
- Практика DSA
- 100 самых популярных задач
- 50 лучших классических задач
- Лучшие алгоритмы
- Компилятор С/С++
- Компилятор Java
- Компилятор Python
- Компилятор JavaScript
- компилятор PHP
- Компилятор C#
- Свяжитесь с нами
- Политика конфиденциальности
- условия обслуживания
- Подпишитесь на новые публикации
Techie Delight © 2023 Все права защищены.
Этот веб-сайт использует файлы cookie. Используя этот сайт, вы соглашаетесь с использованием файлов cookie, нашей политикой, условиями авторского права и другими условиями. Читайте наши Политика конфиденциальности. Понятно
Питон , из кортежа в строку
У меня только мысли засунуть в список, потом вытащить, но всё равно есть кавычки, как от них избавиться?
a = lst=[] for i in a: lst.append(i) print(lst) ['532', '34', '0', '76']
Отслеживать
задан 24 дек 2018 в 16:37
93 1 1 серебряный знак 8 8 бронзовых знаков
‘, ‘.join([i for i in <"34", "76", "0", "532">])"34",>
24 дек 2018 в 16:44
<"34", "76", "0", "532">не кортеж, а множество, без дубликатов и без сохранения порядка. Кортежи в круглых скобках: («34», «76», «0», «532»). Они упорядоченные и позволяют дубликаты."34",>
24 дек 2018 в 18:12
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
Как минимум, (если есть уверенность, что в кортеже только числа) можно в список добавлять числа, а не строки, т. е. вместо lst.append(i) , добавлять lst.append(int(i)) , но есть способ короче:
", ".join(a)
'0, 34, 532, 76'
Отслеживать
ответ дан 24 дек 2018 в 16:45
78 8 8 бронзовых знаков
У вас множество, не кортеж. Поэтому порядок элементов не будет сохранен. Вывести можно так
Отслеживать
ответ дан 24 дек 2018 в 16:46
3,627 2 2 золотых знака 12 12 серебряных знаков 14 14 бронзовых знаков
Можно воспользоваться распаковкой аргумента.
Отслеживать
ответ дан 24 дек 2018 в 17:04
Sour Sourse Sour Sourse
491 1 1 золотой знак 3 3 серебряных знака 9 9 бронзовых знаков
Чтобы сделать числа из строк, примените функцию int() .
Чтобы применить функцию к всякому элементу кортежи / списка / множества, используйте функцию map() , в которой в качестве первого параметра будет эта функция (без скобок):
map(int, а) # a =
Результатом будет генератор, из которого можете сделать кортеж, список или множество функциями tuple() , list() или set() . Например для
print(list(map(int, a)))
[532, 34, 0, 76]
for i in map(int, a): # в цикле for list() не нужен print(i)
76 0 532 34
for i in map(int, a): print("".format(i)) # 5 значит число позиций для цифр (может выть другое)
76 34 532 0
