Как я могу получить конкатенацию двух списков в Python без изменения любого из них? [дубликат]
этот вопрос уже есть ответ здесь:
- Как объединить два списка в Python? 28 ответов
в Python, единственный способ, который я могу найти, чтобы объединить два списка-это list.extend
, который изменяет первый список. Есть ли функция конкатенации, которая возвращает свой результат без изменения его аргументов?
7 ответов:
в зависимости от того, как вы собираетесь использовать его после создания
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)
чтобы создать полный список, но это создаст новый список в памяти.
вы также можете использовать
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
.