Cum pot obține de concatenare a două liste în Python fără a modifica nici unul?

În Python, singurul mod în care pot găsi pentru a concatena două liste este lista.extinde`, care modifică prima listă. Este acolo orice concatenare funcție care returnează rezultatul său fără a modifica argumentele sale?

Soluția

Da: list1+lista2. Acest lucru vă oferă o listă nouă care este concatenarea list1 " și " list2.

Comentarii (5)

În funcție de modul're de gând să-l folosească după ce se's-a creat itertools.lanț ar putea fi cel mai bun pariu:

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

Acest lucru creează un generator pentru elementele din listă combinată, care are avantajul că nu nouă listă trebuie să fie create, dar puteți folosi în continuare " c " ca și cum ar fi concatenarea a două liste:

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

Dacă listele sunt mari și eficiență este un motiv de îngrijorare, atunci acest lucru și alte metode de itertools` module sunt foarte la îndemână să știi.

Rețineți că acest exemplu foloseste-te de elementele din "c", deci'd trebuie să reinițializează înainte de a putea refolosi. Desigur, puteți folosi doar lista(c)` pentru a crea lista completă, dar că va crea o nouă listă în memorie.

Comentarii (1)

concatenated_list = list_1 + list_2

Comentarii (2)

Puteți folosi, de asemenea, "sumă", dacă vă dau un "start" argument:

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

Aceasta funcționează, în general, pentru orice a + 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

Cu excepția notabilă a siruri de caractere:

>>> sum(['123', '345', '567'], '')
Traceback (most recent call last):
  File "", line 1, in 
TypeError: sum() can't sum strings [use ''.join(seq) instead]
Comentarii (2)

ai putea întotdeauna de a crea o nouă listă care este un rezultat al adăugarea a două liste.

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

Listele sunt mutabile secvențe deci cred că are sens de a modifica listele inițiale de a extinde sau append.

Comentarii (1)

Și dacă aveți mai mult de două liste pentru a înlănțui:

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)

Nu't salva de fapt orice moment (intermediar liste sunt încă create) dar frumos, dacă aveți un număr variabil de liste pentru a aplatiza, de exemplu, *args.

Comentarii (0)

Doar să știi:

Atunci când scrie list1 + lista2, sunt de asteptare __add__ metoda de list1, care returnează o listă nouă. în acest fel, puteți, de asemenea, face cu myobject + list1 prin adăugarea __add__ metoda la clasă personal.

Comentarii (0)