В Python единственный способ найти два списка - list.extend
, который изменяет первый список. Есть ли какая-либо функция конкатенации, которая возвращает свой результат без изменения его аргументов?
Как я могу получить конкатенацию двух списков в Python без изменения одного?
Ответ 1
Да: list1+list2
. Это дает новый список, который является конкатенацией list1
и list2
.
Ответ 2
В зависимости от того, как вы собираетесь использовать его, как только он создаст itertools.chain
, вам будет лучше:
>>> import itertools
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = itertools.chain(a, b)
Это создает генератор для элементов в объединенном списке, который имеет то преимущество, что новый список не должен быть создан, но вы все равно можете использовать c
, как если бы это была конкатенация двух списков:
>>> for i in c:
... print i
1
2
3
4
5
6
Если ваши списки большие, а эффективность - проблема, то этот и другие методы из модуля itertools
очень удобны для понимания.
Обратите внимание, что этот пример использует элементы в c
, поэтому вам нужно повторно инициализировать его, прежде чем вы сможете его повторно использовать. Конечно, вы можете просто использовать list(c)
для создания полного списка, но это создаст новый список в памяти.
Ответ 3
concatenated_list = list_1 + list_2
Ответ 4
Вы также можете использовать sum
, если вы дадите ему аргумент start
:
>>> list1, list2, list3 = [1,2,3], ['a','b','c'], [7,8,9]
>>> all_lists = sum([list1, list2, list3], [])
>>> all_lists
[1, 2, 3, 'a', 'b', 'c', 7, 8, 9]
Это работает вообще для всего, что имеет оператор +
:
>>> sum([(1,2), (1,), ()], ())
(1, 2, 1)
>>> sum([Counter('123'), Counter('234'), Counter('345')], Counter())
Counter({'1':1, '2':2, '3':3, '4':2, '5':1})
>>> sum([True, True, False], False)
2
За исключением заметных строк:
>>> sum(['123', '345', '567'], '')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]
Ответ 5
вы всегда можете создать новый список, который является результатом добавления двух списков.
>>> k = [1,2,3] + [4,7,9]
>>> k
[1, 2, 3, 4, 7, 9]
Списки являются изменяемыми последовательностями, поэтому я предполагаю, что имеет смысл модифицировать исходные списки по расширению или добавлению.
Ответ 6
И если у вас есть более двух списков, чтобы объединить:
import operator
list1, list2, list3 = [1,2,3], ['a','b','c'], [7,8,9]
reduce(operator.add, [list1, list2, list3])
# or with an existing list
all_lists = [list1, list2, list3]
reduce(operator.add, all_lists)
Это фактически не спасает вас (промежуточные списки все еще созданы), но приятно, если у вас есть переменное количество списков, чтобы сгладить, например, *args
.
Ответ 7
Просто чтобы вы знали:
Когда вы пишете list1 + list2
, вы вызываете метод __add__
list1
, который возвращает новый список. таким образом вы также можете иметь дело с myobject + list1
, добавив метод __add__
в свой личный класс.