Как объединить два списка в Python?
Проблема: Как объединить два списка в Python?
Я хочу объединить два списка, но не знаю, как это сделать. У меня есть следующий код:
listone = [1, 2, 3]
listtwo = [4, 5, 6]
Я ожидаю получить следующий результат:
>>> joinedlist
[1, 2, 3, 4, 5, 6]
Как правильно объединить эти два списка?
5 ответ(ов)
Вы можете использовать множества (sets) для получения объединённого списка уникальных значений. Вот пример кода на Python:
mergedlist = list(set(listone + listtwo))
Этот код объединяет два списка listone
и listtwo
, затем преобразует их в множество, что автоматически удаляет дубликаты, и в конце снова преобразует множество в список. В результате вы получите список, содержащий только уникальные элементы из обоих исходных списков.
Если вы хотите объединить два отсортированных списка в один отсортированный список, вы можете использовать функцию merge
из библиотеки heapq
.
Вот пример кода:
from heapq import merge
a = [1, 2, 4]
b = [2, 4, 6, 7]
print(list(merge(a, b)))
Этот код объединит списки a
и b
и выведет результат в отсортированном виде. Обратите внимание, что merge
работает с любым количеством отсортированных списков, поэтому вы можете передавать и больше списков, если это необходимо.
Стоит отметить, что функция itertools.chain
принимает переменное количество аргументов:
>>> l1 = ['a']; l2 = ['b', 'c']; l3 = ['d', 'e', 'f']
>>> [i for i in itertools.chain(l1, l2)]
['a', 'b', 'c']
>>> [i for i in itertools.chain(l1, l2, l3)]
['a', 'b', 'c', 'd', 'e', 'f']
Если на вход подается итерируемый объект (кортеж, список, генератор и т.д.), то можно использовать метод класса from_iterable
:
>>> il = [['a'], ['b', 'c'], ['d', 'e', 'f']]
>>> [i for i in itertools.chain.from_iterable(il)]
['a', 'b', 'c', 'd', 'e', 'f']
Таким образом, chain
удобен как для объединения отдельных элементов, так и для работы с итерируемыми объектами.
Этот вопрос напрямую касается объединения двух списков. Однако он достаточно популярен в поисковых системах, даже когда вы ищете способ объединения множества списков (включая случай, когда вы объединяете ноль списков).
Я считаю, что лучшим вариантом будет использование генераторов списков:
>>> a = [[1,2,3], [4,5,6], [7,8,9]]
>>> [x for xs in a for x in xs]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Вы также можете создать генераторы:
>>> map(str, (x for xs in a for x in xs))
['1', '2', '3', '4', '5', '6', '7', '8', '9']
Старый ответ
Рассмотрите более общий подход:
from functools import reduce
a = [[1,2,3], [4,5,6], [7,8,9]]
reduce(lambda c, x: c + x, a, [])
Это выведет:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Обратите внимание, что это также работает корректно, когда a
равно []
или [[1,2,3]]
.
Однако это можно сделать более эффективно с помощью модуля itertools
:
import itertools
a = [[1,2,3], [4,5,6], [7,8,9]]
list(itertools.chain(*a))
Если вам не нужен список, а просто итерируемый объект, вы можете опустить вызов list()
.
Обновление
Альтернативный подход, предложенный Патриком Коллинзом в комментариях, также может вам подойти:
sum(a, [])
Вы можете просто использовать оператор +
или +=
следующим образом:
a = [1, 2, 3]
b = [4, 5, 6]
c = a + b
Или:
c = []
a = [1, 2, 3]
b = [4, 5, 6]
c += (a + b)
Кроме того, если вам нужно, чтобы значения в объединенном списке были уникальными, вы можете сделать так:
c = list(set(a + b))
Как объединить два списка в Python?
Как получить последний элемент списка?
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Самый быстрый способ проверить наличие значения в списке
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе