Chociaż można użyć czegoś, co wywołuje __add__
sekwencyjnie, że jest bardzo źle rzecz (na początek możesz stworzyć tyle nowych list, ile list zawiera dane wejściowe, co kończy się kwadratową złożonością).
standardowe narzędzie jest itertools.chain
:
def concatenate(*lists):
return itertools.chain(*lists)
lub
def concatenate(*lists):
return itertools.chain.from_iterable(lists)
powoduje przywrócenie generator, który daje w wyniku każdego elementu wykazach sekwencji. Jeśli jest to potrzebne w postaci listy, użyj list
: list(itertools.chain.from_iterable(lists))
Jeśli domagać się robi to "ręcznie", a następnie użyć
extend
:
def concatenate(*lists):
newlist = []
for l in lists: newlist.extend(l)
return newlist
Właściwie nie używać extend
w ten sposób - to wciąż nieefektywne, ponieważ musi nadal rozszerzać oryginalną listę. „Prawo” sposób (jest to nadal bardzo zły sposób):
def concatenate(*lists):
lengths = map(len,lists)
newlen = sum(lengths)
newlist = [None]*newlen
start = 0
end = 0
for l,n in zip(lists,lengths):
end+=n
newlist[start:end] = list
start+=n
return newlist
http://ideone.com/Mi3UyL
Musisz pamiętać, że to wciąż kończy się robi jak wiele operacji kopiowania, ponieważ istnieją całkowite szczeliny w listach.Tak więc nie jest to lepsze niż użycie list(chain.from_iterable(lists))
i jest prawdopodobnie gorsze, ponieważ list
może korzystać z optymalizacji na poziomie C.
Wreszcie, oto wersja użyciu extend
(nieoptymalne) w jednej linii, przy użyciu zmniejszają:
concatenate = lambda *lists: reduce((lambda a,b: a.extend(b) or a),lists,[])
Nie trzeba pisać tej funkcji, tylko 'od łańcucha importu itertools'. –