Jak Mogę uzyskać połączenie dwóch list w Pythonie bez modyfikowania żadnej z nich? [duplikat]

To pytanie ma już odpowiedź tutaj:

W Pythonie jedynym sposobem na połączenie dwóch list jest list.extend, który modyfikuje pierwszą listę. Czy istnieje jakaś funkcja konkatenacyjna, która zwraca wynik bez modyfikowania argumentów?

Author: Ryan Thompson, 2010-12-03

7 answers

Tak: list1+list2. Daje to nową listę będącą połączeniem list1 i list2.

 898
Author: NPE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-03 10:56:27

W zależności od tego, jak zamierzasz go użyć po utworzeniu itertools.chain może być lepiej:

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

Tworzy to generator dla elementów z połączonej listy, co ma tę zaletę, że nie trzeba tworzyć nowej listy, ale nadal można używać c tak, jakby była to konkatenacja dwóch list:

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

Jeśli Twoje listy są duże, a wydajność jest problemem, to ta i inne metody z modułu itertools są bardzo przydatne.

Zauważ, że ten przykład wykorzystuje elementy z c, więc musisz go ponownie uruchomić, zanim będziesz mógł go ponownie użyć. Oczywiście możesz użyć list(c), aby utworzyć pełną listę, ale to spowoduje utworzenie nowej listy w pamięci.

 136
Author: Scott Griffiths,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-03 14:36:12

concatenated_list = list_1 + list_2

 87
Author: Johan Kotlinski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-17 21:13:49

Możesz również użyć sum, Jeśli podasz mu argument 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]

Działa to ogólnie dla wszystkiego, co ma operator +:

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

Z zauważalnym wyjątkiem ciągów:

>>> 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]
 78
Author: Thomas Ahle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-25 08:00:02

Zawsze można utworzyć nową listę, która jest wynikiem dodania dwóch list.

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

Listy są zmiennymi sekwencjami, więc wydaje mi się, że warto modyfikować oryginalne listy przez extend lub append.

 41
Author: pyfunc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-03 09:18:16

I jeśli masz więcej niż dwie listy do konkatenacji:

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)

Faktycznie nie oszczędza Ci czasu (listy pośrednie są nadal tworzone), ale miło, jeśli masz zmienną liczbę list do spłaszczenia, np. *args.

 16
Author: Jake Biesinger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-27 08:41:42

Żeby dać Ci znać:

Kiedy piszesz list1 + list2, wywołujesz __add__ metodę list1, która zwraca nową listę. w ten sposób możesz również poradzić sobie z myobject + list1, dodając metodę __add__ do swojej osobistej klasy.

 15
Author: Ant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-25 20:25:46