Jak Mogę uzyskać połączenie dwóch list w Pythonie bez modyfikowania żadnej z nich? [duplikat]
To pytanie ma już odpowiedź tutaj:
- Jak połączyć dwie listy w Pythonie? 28 odpowiedzi
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?
7 answers
Tak: list1+list2
. Daje to nową listę będącą połączeniem list1
i list2
.
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.
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
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]
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.
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
.
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.
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