Как получить конкатенацию двух списков в Python, не изменяя ни один из них?

В Python единственным способом конкатенации двух списков является функция list.extend, которая модифицирует первый список. Существует ли какая-либо функция конкатенации, которая возвращает результат без изменения аргументов?

Решение

Да: list1+list2. Это дает новый список, который является конкатенацией list1 и list2.

Комментарии (5)

В зависимости от того, как вы'ре собирается использовать его, когда он's создавал модуле itertools.цепь может быть ваш лучший выбор:

>>> import itertools
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = itertools.chain(a, b)

Это создает генератор для элементов в комбинированном списке, который имеет то преимущество, что не новый список должен быть создан, но вы все еще можете использовать с, как будто это конкатенация двух списков:

>>> for i in c:
...     print i
1
2
3
4
5
6

Если списки большие, а эффективность является проблемой, то это и других методов из модуля модуле itertools очень полезно знать.

Обратите внимание, что этот пример использует предметы на C, так что вы'd нужен для установки исходных его, прежде чем вы можете использовать его. Конечно, вы можете просто использовать список(С)`, чтобы создать полный список, но это будет создать новый список в памяти.

Комментарии (1)

конкатенированный_список = список_1 + список_2.

Комментарии (2)

Вы также можете использовать сумма, если вы даете ему "старт" аргумент:

>>> 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 "", line 1, in 
TypeError: sum() can't sum strings [use ''.join(seq) instead]
Комментарии (2)

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

>>> k = [1,2,3] + [4,7,9]
>>> k
[1, 2, 3, 4, 7, 9]

Списки являются изменяемыми последовательностями, поэтому, я думаю, имеет смысл модифицировать исходные списки путем расширения или добавления.

Комментарии (1)

И если у вас есть более чем два списка объединить:

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)

Это не'т спасти вас в любое время (промежуточных списков до сих пор создается), но хороший, если у вас есть переменная количество списков, чтобы сгладить, например, *аргументы.

Комментарии (0)

Просто чтобы вы знали:

Когда вы пишете список1 + список2, вы зовете __добавить метод__ в "список 1", который возвращает новый список. таким образом, вы также можете бороться с мой_объект + список1 добавив __добавить метод__ на ваш персональный класс.

Комментарии (0)