Как сложить списки в python поэлементно

от admin

Как сложить элементы двух списков?

Если важно сохранить начальные списки, то попробуем по другому:

Вариант 3:

В Python 3.8 появился "морж" — оператор := Если важно не повторить функционал:

Если вы еще не «прошли ‘from’ ‘import'», то наиболее простой вариант выглядит вот так:

При необходимости обернуть это в вызов функции, надеюсь, сможете сделать самостоятельно: на вход a и b, указанные выражения — в качестве параметра в return.

Если у вас списка ВСЕГДА точно будут одной длины, то можно воспользоваться генератор списков и zip:

Но если вы НЕ уверены, что длина списков будет одинаковой хоть раз, то здесь нужно воспользоваться крутой библиотекой itertools:

Как объединить списки в Python

В этом руководстве мы представим различные методы объединения списков в Python. Списки служат для хранения однородных элементов и выполнения над ними манипуляций.

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

Ниже приведены 6 способов объединения списков в Python.

  • оператор конкатенации (+);
  • метод Naive;
  • List Comprehension;
  • метод extension()
  • оператор ‘*’;
  • метод itertools.chain().

1. Оператор (+) для конкатенации списков

Оператор «+» можно использовать для объединения двух списков. Он добавляет один список в конец другого списка и дает новый список в качестве вывода.

2. Метод Naive

В методе Naive цикл for используется для обхода второго списка. После этого элементы из второго списка добавляются к первому списку. Первый список является объединением первого и второго списков.

3. Concatenated list для объединения списков

Concatenated list в Python – это альтернативный метод объединения двух списков в Python. Понимание списка – это в основном процесс построения и генерации списка элементов на основе существующего списка.

Он использует цикл for для обработки и обхода списка поэлементно. Приведенный ниже встроенный цикл for эквивалентен вложенному циклу for.

4. Метод extend()

Метод extend() можно использовать для объединения двух списков в Python. Функция extend() выполняет итерацию по переданному параметру и добавляет элемент в список, тем самым расширяя список линейным образом.

Все элементы list2 добавляются к list1, и, таким образом, list1 обновляется и выводится.

5. Оператор ‘*’

Оператор Python ‘*’ можно использовать для простого объединения двух списков. Оператор ‘*’ в Python в основном распаковывает коллекцию элементов по аргументам индекса.

Например: рассмотрим список my_list = [1, 2, 3, 4].

Оператор * my_list заменит список его элементами в позициях индекса. Таким образом, он распаковывает элементы списков.

В приведенном выше фрагменте кода инструкция res = [* list1, * list2] заменяет list1 и list2 элементами в заданном порядке, то есть элементами list1 после элементов list2. Это выполняет конкатенацию и приводит к выводу ниже.

6. Метод Python itertools.chain()

Функция itertools.chain() модулей itertools также может использоваться для объединения списков в Python. Функция принимает в качестве параметров различные итерации, такие как списки, строки, кортежи и т.д., и выдает их последовательность в качестве вывода.

В результате получается линейная последовательность. Тип данных элементов не влияет на работу метода chain().

6 способов слияния списка списков

Зашел тут у нас в офисе разговор как наиболее «красиво» и быстро склеить список списков в Питоне. Действительно как?

Даже такую казалось бы тривиальную задачу можно решить несколькими способами, существенно отличающимися по скорости и выразительности.

ВАРИАНТ1
Все знают, что элементы списка можно перебирать в цикле и, то что можно добавлять элементы в конец. Это приводит нас к первому варианту решения:

Это самая медленная реализация. Прокол в том что в таком виде оператор «+» в каждом шаге создает новый объект-список, который на следующем шаге выкидывается и т.д.

ВАРИАНТ3
Исправить легко, надо заменить «+» на форму которая не создает новый список, а добавляет к старому. Это оператор «+ #ff7700″>def listmerge3 ( lstlst ) :
all = [ ]
for lst in lstlst:
all . extend ( lst )
return all
Все последующие решения я буду писать через лямбда-выражения, тк они состоят из одного выражения. Имя аргумента сокращено до ll, тк в коде в одну строку это не уменьшает читабельности.

Читать:
Как сделать прокрутку внутри блока div

Он чуть чуть быстрее, но все еще тормозной по той же причине, что и его итеративный родственник. Здесь «lambda a,b: a+b» — анонимная функция двух аргументов, которая просто возвращает их сумму. Вариант B это просто шорткат, встроенный в Питон для удобста вычисления суммы элементов. Этот вариант самый короткий.

Лично меня не устраивает ни самый короткий (скорость), ни самый быстрый (красота). Попробуем найти компромисс.

ВАРИАНТ5
С помощью списковых выражений:

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

ВАРИАНТ6
А что если попробовать переписать самый быстрый вариант в функцональном стиле? Легко:

Заметьте «d.extend(el) or d» нам пришлось добавить оператор «or» тк метод extend возвращает None. По скорости он практически не уступает самому быстрому методу №3 (разница в скорости буквально единицы процентов и на мой взгляд не существенна).

По моему мнению «выбор редакции» стоит присудить варианту №6)

Для замеров скорости маленьких кусков кода в Питоне есть библиотека timeit. Вот пример кода, тестирующего варианты 3, 5 и 6 (самые быстрые и красивые).

variants = <
‘Reduce’ :
‘listmerge=lambda s: reduce(lambda d,el: d.extend(el) or d, s, [])’ ,
‘Iterate’ :
«»»
def listmerge(lstlst):
all=[]
for lst in lstlst:
all.extend(lst)
return all
«»» ,
‘Comprehension’ :
‘listmerge=lambda ll: [x for lst in ll for x in lst]’ ,
>

initstr= ‘lstlst=[range(i) for i in range(1000)] \n gc.enable()’

def test ( variants, initstr,n= 100 ) :
print «Test repeats n #483d8b»>» times \n INITSTR:» ,initstr, » \n \n »
for k,v in variants. iteritems ( ) :
print k, » — » , timeit . Timer ( «listmerge(lstlst)» , initstr+ » \n » +v ) . timeit ( n )
print

test ( variants,initstr, 100 )

Пример запуска теста времени. Видно что разница скорости между итеративным и функциональным вариантом исчезающе мала. Вариант на списковых выражениях заметно медленней (тут на погрешности не спишешь), но и размер наших списков огромен, для некритичных к скорости приложений он тоже имеет право на жизнь.
Test repeats n = 100 times
INITSTR: lstlst=[range(i) for i in range(1000)]
gc.enable()

Iterate — 1.56133103371
Reduce — 1.57647109032
Comprehension — 7.5749669075

ДОМАШНЕЕ ЗАДАНИЕ
Предлагаю решить/обсудить более сложную задачу развертывание вложенных списков в линейный.
Пример:

UPD2:
ВАРИАНТ 6Б (от анонимного комментатора в ЖЖ)

Объединить два списка в Python

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

1. Использование + оператор

Списки в Python поддерживают такие операции, как конкатенация с использованием + оператор. Это показано ниже:

2. Использование operator.add() функция

Кроме того, вы также можете использовать add(x, y) функцию от operator модуль для объединения двух списков, что эквивалентно выражению x+y .

3. Использование itertools.chain() функция

Вы даже можете связать списки вместе, используя chain() функция itertools модуль. Он возвращает итератор элементов из первого итерируемого объекта, за которым следуют элементы из второго итерируемого объекта.

4. Использование итерируемого оператора распаковки

Начиная с Python 3.5, вы можете использовать * повторяемый оператор распаковки для объединения любого количества списков. Это было введено с принятием PEP 448 — Дополнительные обобщения распаковки.

5. Использование extend() функция

The extend() Функция списка расширяет список, добавляя все элементы из итерации. Его можно использовать для конкатенации, как показано ниже:

Вот и все, что касается объединения двух списков в Python.

Оценить этот пост

Средний рейтинг 5 /5. Подсчет голосов: 4

Голосов пока нет! Будьте первым, кто оценит этот пост.

Сожалеем, что этот пост не оказался для вас полезным!

Расскажите, как мы можем улучшить этот пост?

Спасибо за чтение.

Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.

Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования ��

Похожие статьи