Функция zip() в Python, объединить элементы в список кортежей
Объединяет элементы последовательностей в список кортежей
Синтаксис:
zip(*iterables, strict=False)
Параметры:
- *iterables — последовательность аргументов или итераций.
- strict=False — отвечает за проверку длин переданных итераций. Доступен с версии Python 3.10.
Возвращаемое значение:
- итератор кортежей.
Описание:
Функция zip() создает итератор кортежей, который объединяет элементы каждой из переданных последовательностей *iterables .
>>> for item in zip([1, 2, 3], ['sugar', 'spice', 'everything nice']): . print(item) # (1, 'sugar') # (2, 'spice') # (3, 'everything nice')
Более формально: функция zip() возвращает итератор кортежей, где i-й кортеж содержит i-й элемент из каждой итерации аргументов.
Другой способ понять функцию zip() состоит в том, что она превращает строки в столбцы, а столбцы в строки. Это похоже на транспонирование матрицы.
Функция zip() ленива: элементы не будут обрабатываться, пока не будет повторена итерация, например циклом for/in или заключением в список list(zip()) .
Следует учитывать, что итерации, передаваемые в zip() , могут иметь разную длину, иногда намеренно, а иногда из-за ошибки в коде. Python предлагает три разных подхода к решению этой проблемы:
-
По умолчанию функция zip() останавливается, когда исчерпывается самая короткая итерация. Она проигнорирует оставшиеся элементы в более длинных итерациях, обрезая результат до длины самой короткой итерации:
>>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum'])) # [(0, 'fee'), (1, 'fi'), (2, 'fo')]
>>> list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True)) # [('a', 1), ('b', 2), ('c', 3)]
В отличие от поведения по умолчанию параметр strict=True (доступен с версии Python 3.10), проверяет идентичность длин итераций, вызывая ошибку ValueError , если они не совпадают:
>>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True)) # Traceback (most recent call last): # . # ValueError: zip() argument 2 is longer than argument 1
Пограничные случаи: с одним итерируемым аргументом, функция zip() возвращает итератор из кортежей с одним элементом. Без аргументов он возвращает пустой итератор.
Секреты и уловки:
- Порядок оценки итераций слева направо гарантируется. Это делает возможной идиому для кластеризации ряда данных в группы длиной n с использованием zip(*[iter(s)]*n, strict=True) . Это повторяет один и тот же итератор n раз, так что каждый выходной кортеж имеет результат n вызовов итератора. Это приводит к разделению входных данных на блоки длиной n .
- zip() в сочетании с оператором * можно использовать для распаковки списка:
>>> x = [1, 2, 3] >>> y = [4, 5, 6] >>> list(zip(x, y)) # [(1, 4), (2, 5), (3, 6)] >>> x2, y2 = zip(*zip(x, y)) >>> x == list(x2) and y == list(y2) # True
Изменено в версии 3.10: Добавлен аргумент strict .
Как и где можно использовать функцию zip()
- Распаковка списка кортежей на отдельные списки;
- Сортировка нескольких связанных между собой списков;
- Функция zip() в циклах for/in ;
- Создание словаря из двух списков;
Распаковка списка кортежей на отдельные списки.
Совместно с оператором распаковки * в аргументах функции zip() можно использовать распаковку списка кортежей на отдельные списки:
>>> x = [1, 2, 3] >>> y = [4, 5, 6] # объединим два списка >>> zipped = zip(x, y) >>> list(zipped) # [(1, 4), (2, 5), (3, 6)] # распакуем полученный список кортежей >>> x2, y2 = zip(*zipped) # сравниваем полученные списки # с их исходными значениями >>> list(x2) == x and list(y2) == y # True
Сортировка нескольких связанных между собой списков.
Допустим, что есть несколько списков, которые связаны между собой по индексам и их нужно отсортировать, при этом не нарушив связей.
Рассмотрим такую ситуацию на примере из трех связанных списка, в этом случае связь означает, что нулевой элемент первого списка связан с нулевым элементом второго списка, и с нулевым элементом третьего списка, далее первый элемент первого списка связан с первым элементом второго списка, и с первым элементом третьего списка и т.д.
Следовательно сортировать списки по отдельности нельзя, т.к. нарушиться связь. Смотрим как можно сортировать такие списки, используя функцию zip()
>>> from random import shuffle # приготовим первый список >>> x = list(range(6)) # перемешаем его >>> shuffle(x) # приготовим второй список >>> y = list(range(6)) # третий список пусть будет перевернутый `y` >>> z = list(reversed(y)) # распечатаем для наглядности >>> print(f'x: x>\ny: y>\nz: z>') # x: [3, 5, 2, 1, 4, 0], # y: [0, 1, 2, 3, 4, 5], # z: [5, 4, 3, 2, 1, 0]) # сортируем по первому списку `x` >>> x, y, z = zip(*sorted(zip(x, y, z), key=lambda tpl: tpl[0])) >>> print(f'list(x)>\nlist(y)>\nlist(z)>') # [0, 1, 2, 3, 4, 5] # [5, 3, 2, 0, 4, 1] # [0, 2, 3, 5, 1, 4] # теперь сортируем по последнему списку `z` # обратите внимание, что меняется только # аргумент `key` в функции `sorted()` >>> x, y, z = zip(*sorted(zip(x, y, z), key=lambda tpl: tpl[2])) >>> print(f'list(x)>\nlist(y)>\nlist(z)>') # [0, 4, 1, 2, 5, 3] # [5, 4, 3, 2, 1, 0] # [0, 1, 2, 3, 4, 5]
Функция zip() в циклах for/in .
Есть такие ситуации, когда необходимо перебрать несколько списков в одном цикле for/in . Первое, что приходит в голову, это вытаскивать элементы этих списков в цикле по индексу, как то так:
for i in range(len(list1)) a, b, c = list1[i], list2[i], list3[i] # или for i, a in enumerate(list1) b, c = list2[i], list3[i]
Но есть способ проще и эффектнее с использованием функции zip() :
>>> lst1 = [0, 1, 2, 3, 4, 5] >>> lst2 = [5, 3, 2, 0, 4, 1] >>> lst3 = ['zero', 'one', 'two', 'three', 'four', 'five'] >>> for a, b, c in zip(lst1, lst2, lst3): . print(f'c>:\ta> + b> = a + b>') . # zero: 0 + 5 = 5 # one: 1 + 3 = 4 # two: 2 + 2 = 4 # three: 3 + 0 = 3 # four: 4 + 4 = 8 # five: 5 + 1 = 6
Создание словаря из двух списков.
>>> lst1 = [0, 1, 2, 3, 4, 5] >>> lst2 = ['zero', 'one', 'two', 'three', 'four', 'five'] # создаем словарь при помощи `dict()` >>> dict(zip(lst1, lst2)) # # создаем словарь при помощи выражения генератора # словаря, при этом меняем элементы списков местами >>> d = y: x for x, y in zip(lst1, lst2)> >>> d #
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Функция abs(), абсолютное значение числа
- Функция all(), все элементы True
- Функция any(), хотя бы один элемент True
- Функция ascii(), преобразует строку в ASCII
- Функция bin(), число в двоичную строку
- Класс bool(), логическое значение объекта
- Функция breakpoint(), отладчик кода
- Класс bytearray(), преобразует в массив байтов
- Класс bytes(), преобразует в строку байтов
- Функция callable(), проверяет можно ли вызвать объект
- Функция chr(), число в символ Юникода
- Класс classmethod, делает функцию методом класса
- Функция compile() компилирует блок кода Python
- Класс complex(), преобразует в комплексное число
- Функция delattr(), удаляет атрибут объекта
- Класс dict() создает словарь
- Функция dir(), все атрибуты объекта
- Функция divmod(), делит числа с остатком
- Функция enumerate(), счетчик элементов последовательности
- Функция eval(), выполняет строку-выражение с кодом
- Функция exec(), выполняет блок кода
- Функция filter(), фильтрует список по условию
- Класс float(), преобразует в вещественное число
- Функция format(), форматирует значение переменной
- Класс frozenset(), преобразует в неизменяемое множество
- Функция getattr(), значение атрибута по имени
- Функция globals(), переменные глобальной области
- Функция hasattr(), наличие атрибута объекта
- Функция hash(), хэш-значение объекта
- Функция help(), справка по любому объекту
- Функция hex(), число в шестнадцатеричную строку
- Функция id(), идентификатор объекта
- Функция input(), ввод данных с клавиатуры
- Класс int(), преобразует в тип int
- Функция isinstance(), принадлежность экземпляра к классу
- Функция issubclass(), проверяет наследование класса
- Функция iter(), создает итератор
- Функция len(), количество элементов объекта
- Класс list(), преобразовывает в список
- Функция locals(), переменные локальной области
- Функция map(), обработка последовательности без цикла
- Функция max(), максимальное значение элемента
- Класс memoryview(), ссылка на буфер обмена
- Функция min(), минимальное значение элемента
- Функция next(), следующий элемент итератора
- Класс object(), возвращает безликий объект
- Функция oct(), число в восьмеричную строку
- Функция open(), открывает файл на чтение/запись
- Функция ord(), число символа Unicode
- Функция pow(), возводит число в степень
- Функция print(), печатает объект
- Класс property(), метод класса как свойство
- Класс range(), генерирует арифметические последовательности
- Функция repr(), описание объекта
- Функция reversed(), разворачивает последовательность
- Функция round(), округляет число
- Класс set(), создает или преобразовывает в множество
- Функция setattr(), создает атрибут объекта
- Класс slice(), шаблон среза
- Функция sorted(), выполняет сортировку
- Декоратор staticmethod(), метод класса в статический метод
- Класс str(), преобразует объект в строку
- Функция sum(), сумма последовательности
- Функция super(), доступ к унаследованным методам
- Класс tuple(), создает или преобразует в кортеж
- Класс type(), возвращает тип объекта
- Функция vars(), словарь переменных объекта
- Функция zip(), объединить элементы в список кортежей
- Функция __import__(), находит и импортирует модуль
- Функция aiter(), создает асинхронный итератор
- Функция anext(), следующий элемент асинхронного итератора
Программа Python для объединения двух кортежей
В Python кортежи — это неизменяемый тип последовательности, который обычно используется для хранения коллекции элементов.
Мы можем определить кортеж в Python, используя круглые скобки, заключающие в себя данные, которые мы хотим сохранить:
Var = (1, ‘a’, 3.7)
Бывают случаи, когда нам приходится использовать одну переменную, содержащую элементы двух или более разных кортежей. В таких случаях мы должны знать, как их объединить, чтобы создать одну переменную.
В этой статье мы обсудим, как объединить два кортежа в Python.
Использование оператора +
Как мы знаем, язык программирования Python предоставляет нам широкий спектр операторов и функций, которые позволяют нам легко выполнять сложные задачи, не требуя для этого особых технических знаний.
Использование оператора + является отличным примером того же самого, поскольку он используется для объединения не только кортежей, но также строк и списков. Это самый простой способ объединить два кортежа. Шаги, необходимые для этого процесса, просты.
Шаг 1. Создайте два кортежа.
Шаг 2. Создайте новый кортеж и присвойте ему сумму двух кортежей в качестве значения.
Пример
A = (1, 2, 3) B = ('a', 'b', 'c') print("The first tuple, A : ", A) print("The second tuple, B : ", B) C = A + B print("The resulting tuple is, C : ", C)
Выход
The first tuple, A : (1, 2, 3) The second tuple, B : ('a', 'b', 'c') The resulting tuple is, C : (1, 2, 3, 'a', 'b', 'c')
Использование суммы()
Другой способ создания объединенного кортежа — использование метода sum(), присутствующего по умолчанию в Python. Давайте сначала разберемся, что такое функция sum() и как она используется.
Функция sum в Python используется для получения итерируемого объекта, такого как список, кортеж и т. д., и возвращает сумму его элементов. Но в этом случае мы предоставим ему кортеж кортежей, вложенный кортеж, элементами которого будут кортежи, которые мы хотим объединить, а функция sum вернет нам кортеж со всеми объединенными в нем элементами.
Пример
A = (1, 2, 3) B = ('a', 'b', 'c') print("The first tuple, A : ", A) print("The second tuple, B : ", B) C = sum((A, B), ()) print("The resulting tuple is, C : ", C)
Выход
The first tuple, A : (1, 2, 3) The second tuple, B : ('a', 'b', 'c') The resulting tuple is, C : (1, 2, 3, 'a', 'b', 'c')
Использование метода расширения для объединения списков
Мы будем использовать преобразование типов для преобразования кортежей в списки с помощью метода list, а затем воспользуемся методом расширения для объектов списка, чтобы объединить два созданных нами списка.
Метод расширения используется для перебора итерации и добавления элементов в конец первой итерации. Мы сохраним результат в переменной после преобразования полученного списка обратно в кортеж.
Алгоритм
Шаг 1 — Создайте два кортежа с некоторыми элементами в нем.
Шаг 2 — Распечатайте элементы двух разных кортежей.
Шаг 3 — Преобразуйте кортежи в список с помощью метода list.
Шаг 4. Используйте метод расширения для создания составного списка.
Шаг 5 — Преобразуйте полученный список в кортеж и затем распечатайте его.
Пример
A = (1, 2, 3) B = ('a', 'b', 'c') print("The first tuple, A : ", A) print("The second tuple, B : ", B) listA = list(A) listB = list(B) listA.extend(listB) C = tuple(listA) print("The resulting tuple is, C : ", C)
Выход
The first tuple, A : (1, 2, 3) The second tuple, B : ('a', 'b', 'c') The resulting tuple is, C : (1, 2, 3, 'a', 'b', 'c')
Заключение
В этой статье мы сосредоточились на трех различных способах объединения двух кортежей. Мы изучили питонический способ, который прост и удобен в использовании. Мы также увидели, как можно использовать метод Python по умолчанию sum() для достижения аналогичных результатов. Наконец, мы увидели, как можно использовать преобразование типов и метод списка extend() для объединения.
Все права защищены. © Linux-Console.net • 2019-2023
Как соединить элементы кортежа?
@MaxU, я сделал чуть по другому, но вы в любом случае помогли мне. Извините что сразу не отреагировал, работы много.
11 авг 2020 в 8:48
@MaxU вот ответ res = [(f» «,) + i[2:] for i in data]
11 авг 2020 в 8:49
@MaxU да, видимо я не дописал. Спасибо вам!
12 авг 2020 в 8:41
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
data = ('2020-08-02', '00:00', 'A', 'B', 'C') res = (f" ",) + data[2:]
In [121]: res Out[121]: ('2020-08-02 00:00', 'A', 'B', 'C')
Отслеживать
ответ дан 7 авг 2020 в 10:45
MaxU — stand with Ukraine MaxU — stand with Ukraine
149k 12 12 золотых знаков 59 59 серебряных знаков 132 132 бронзовых знака
- python
- list
- tuple
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Python: коллекции, часть 3/4: объединение коллекций, добавление и удаление элементов
Для кого: для изучающих Python и уже имеющих начальное представление о коллекциях и работе с ними, желающих систематизировать и углубить свои знания, сложить их в целостную картину.
Оглавление:
- Объединение строк, кортежей, списков, словарей без изменения исходных.
- Объединение множеств без изменения исходных.
- Объединение списка, словаря и изменяемого множества с изменением исходной коллекции.
- Добавление и удаление элементов изменяемых коллекций.
- Особенности работы с изменяемой и не изменяемой коллекцией.
1. Объединение строк, кортежей, списков, словарей без изменения исходных
Рассмотрим способы объединения строк, кортежей, списков, словарей без изменения исходных коллекций — когда из нескольких коллекций создаётся новая коллекция того же тип без изменения изначальных.
-
Объединение строк (string) и кортежей (tuple) возможна с использованием оператора сложения «+»
str1 = 'abc' str2 = 'de' str3 = str1 + str2 print(str3) # abcde tuple1 = (1, 2, 3) tuple2 = (4, 5) tuple3 = tuple1 + tuple2 print(tuple3) # (1, 2, 3, 4, 5)
-
Добавляем все элементы второго списка к элементам первого, (аналог метод .extend() но без изменения исходного списка):
a = [1, 2, 3] b = [4, 5] c = a + b print(a, b, c) # [1, 2, 3] [4, 5] [1, 2, 3, 4, 5]
a = [1, 2, 3] b = [4, 5] c = a + [b] print(a, b, c) # [1, 2, 3] [4, 5] [1, 2, 3, [4, 5]]
a, b = [1, 2, 3], [4, 5] c = [*a, *b] # работает на версии питона 3.5 и выше print(c) # [1, 2, 3, 4, 5]
Сложить два словаря чтобы получить третий оператором + Питон не позволяет «TypeError: unsupported operand type(s) for +: ‘dict’ and ‘dict’».
Это можно сделать по-другому комбинируя методы .copy() и .update():
dict1 = dict2 = dict3 = dict1.copy() dict3.update(dict2) print(dict3) #
В Питоне 3.5 появился новый более изящный способ:
dict1 = dict2 = dict3 = <**dict1, **dict2>print(dict3) #
2. Объединение множеств без изменения исходных
Для обоих типов множеств (set, frozenset) возможны различные варианты комбинации множеств (исходные множества при этом не меняются — возвращается новое множество).

# Зададим исходно два множества (скопировать перед каждым примером ниже) a = b = < 'b', 'c'># отступ перед b для наглядности
c = a.union(b) # c = b.union(a) даст такой же результат # c = a + b # Обычное объединение оператором + не работает # TypeError: unsupported operand type(s) for +: 'set' and 'set' c = a | b # Альтернативная форма записи объединения print(c) #
c = a.intersection(b) # c = b.intersection(a) даст такой же результат c = a & b # Альтернативная форма записи пересечения print(c) #
Пересечение более 2-х множеств сразу:
a = b = < 'b', 'c'>c = < 'b', 'd'>d = a.intersection(b, c) # Первый вариант записи d = set.intersection(a, b, c) # Второй вариант записи (более наглядный) print(d) #
c = a.difference(b) # c = a - b другой способ записи дающий тот же результат print(c) # c = b.difference(a) # c = b - a другой способ записи дающий тот же результат print(c) #
c = b.symmetric_difference(a) # c = a.symmetric_difference(b) # даст такой же результат c = b ^ a # Альтернативная форма записи симметричной разницы print(c) #
3. Объединение списка, словаря и изменяемого множества с изменением исходной коллекции
-
Добавляем все элементы второго списка к элементам первого с измением первого списка методом .extend():
a.extend(b) # a += b эквивалентно a.extend(b) print(a, b) # [1, 2, 3, 4, 5] [4, 5]
a.append(b) # a += [b] эквивалентно a.append(b) print(a, b) # [1, 2, 3, [4, 5]] [4, 5]
Обратите внимание: для совпадающих ключей словаря при этом обновляются значения:
dict1 = dict2 = dict1.update(dict2) print(dict1) #
a = b = < 'b', 'c'>a.difference_update(b) print(a, b) # a = b = < 'b', 'c'>b.difference_update(a) print(a, b) #
a = b = < 'b', 'c'>a.intersection_update(b) print(a, b) # a = b = < 'b', 'c'>b.intersection_update(a) print(a, b) #
a = b = < 'b', 'c'>a.symmetric_difference_update(b) print(a, b) # a = b = < 'b', 'c'>b.symmetric_difference_update(a) print(a, b) #
4 Добавление и удаление элементов изменяемых коллекций
Добавление и удаление элементов в коллекцию возможно только для изменяемых коллекций: списка (list), множества (только set, не frozenset), словаря (dict). Причём для списка, который является индексированной коллекцией, также важно на какую позицию мы добавляем элемент.

Примеры использования метода .insert(index, element)
my_list = [1, 2, 3] my_list.insert(0, 0) # index = 0 - вставляем в начало print(my_list) # [0, 1, 2, 3] my_list.insert(10, 4) # Индекс выходит за границы списка - просто добавим в конец print(my_list) # [0, 1, 2, 3, 4] my_list.insert(-10, -1) # Индекс выходит за границы в минус - добавим в начало print(my_list) # [-1, 0, 1, 2, 3, 4] my_list = [1, 2, 3] my_list.insert(1, 1.5) # Вставим между 1 и 2 (индексация с нуля!) # То есть вставляется на позицию с указанным индексом, а то значение что на ней было # и те что правее - сдвигаются на 1 индекс вправо print(my_list) # [1, 1.5, 2, 3]
Примеры использования оператора del
# Работает со списком my_list = [1, 2, 3, 4, 5, 6, 7] del my_list[1] # Удаление элемента по индексу print(my_list) # [1, 3, 4, 5, 6, 7] del my_list[-3:-1] # Удаление элементов выбранных срезом print(my_list) # [1, 3, 4, 7] # del my_list[10] # IndexError: list assignment index out of range # Работает со словарем my_dict = del my_dict['b'] print(my_dict) # # del my_dict['z'] # KeyError при попытке удалить не сушествующий
5 Особенности работы с изменяемой и не изменяемой коллекцией
-
Строка неизменяемая коллекция — если мы ее меняем — мы создаем новый объект!
str1 = 'abc' print(str1, id(str1)) # abc 140234080454000 str1 += 'de' print(str1, id(str1)) # abcde 140234079974992 - Это НОВЫЙ объект, с другим id!
Пример кода с двумя исходно идентичными строками.
str1 = 'abc' str2 = str1 print(str1 is str2) # True - это две ссылки на один и тот же объект! str1 += 'de' # Теперь переменная str1 ссылается на другой объект! print(str1 is str2) # False - теперь это два разных объекта! print(str1, str2) # abcde abc - разные значения
list1 = [1, 2, 3] list2 = list1 print(list1 is list2) # True - это две ссылки на один и тот же объект! # А дальше убеждаемся, насколько это важно: list1 += [4] print(list1, list2) # [1, 2, 3, 4] [1, 2, 3, 4] # изменилось значение ОБЕИХ переменных, так как обе переменные ссылаются на один объект!
А если нужна независимая копия, с которой можно работать отдельно?
list1 = [1, 2, 3] list2 = list(list1) # Первый способ копирования list3 = list1[:] # Второй способ копирования list4 = list1.copy() # Третий способ копировани - только в Python 3.3+ print(id(list1), id(list2), id(list3), id(list4)) # все 4 id разные, что значит что мы создали 4 разных объекта list1 += [4] # меняем исходный список print(list1, list2, list3, list4) # [1, 2, 3, 4] [1, 2, 3] [1, 2, 3] [1, 2, 3] # как мы и хотели - изменив исходный объект, его копии остались не тронутыми
Приглашаю к обсуждению:
- Если я где-то допустил неточность или не учёл что-то важное — пишите в комментариях, важные комментарии будут позже добавлены в статью с указанием вашего авторства.
- Если какие-то моменты не понятны и требуется уточнение — пишите ваши вопросы в комментариях — или я или другие читатели дадут ответ, а дельные вопросы с ответами будут позже добавлены в статью.