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


этот вопрос уже есть ответ здесь:

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

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

7 525

7 ответов:

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

в зависимости от того, как вы собираетесь использовать его после создания 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 модуль очень полезно знать.

отметьте, что этот пример использует элементы!--3-->, поэтому вам нужно будет повторно инициализировать его, прежде чем вы сможете его использовать. Конечно, вы можете просто использовать list(c) чтобы создать полный список, но это создаст новый список в памяти.

concatenated_list = list_1 + list_2

вы также можете использовать sum, Если вы дадите ему :

>>> 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]

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

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

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

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

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.

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

когда вы пишите list1 + list2, по телефону __add__ метод list1, который возвращает новый список. таким образом, вы также можете иметь дело с myobject + list1 добавить __add__ метод для вашего личного класса.