How do I concatenate two lists in Python?
Example:
listone = [1, 2, 3]
listtwo = [4, 5, 6]
Expected outcome:
>&g
How do I concatenate two lists in Python?
As of 3.9, these are the most popular stdlib methods for concatenating two (or more) lists in python.
Footnotes
This is a slick solution because of its succinctness. But
sum
performs concatenation in a pairwise fashion, which means this is a quadratic operation as memory has to be allocated for each step. DO NOT USE if your lists are large.See chain and chain.from_iterable from the docs. You will need to
import itertools
first. Concatenation is linear in memory, so this is the best in terms of performance and version compatibility.chain.from_iterable
was introduced in 2.6.This method uses Additional Unpacking Generalizations (PEP 448), but cannot generalize to N lists unless you manually unpack each one yourself.
a += b
anda.extend(b)
are more or less equivalent for all practical purposes.+=
when called on a list will internally calllist.__iadd__
, which extends the first list by the second.
2-List Concatenation1
There's not much difference between these methods but that makes sense given they all have the same order of complexity (linear). There's no particular reason to prefer one over the other except as a matter of style.
N-List Concatenation
Plots have been generated using the perfplot module. Code, for your reference.
1. The iadd
(+=
) and extend
methods operate in-place, so a copy has to be generated each time before testing. To keep things fair, all methods have a pre-copy step for the left-hand list which can be ignored.
DO NOT USE THE DUNDER METHOD list.__add__
directly in any way, shape or form. In fact, stay clear of dunder methods, and use the operators and operator
functions like they were designed for. Python has careful semantics baked into these which are more complicated than just calling the dunder directly. Here is an example. So, to summarise, a.__add__(b)
=> BAD; a + b
=> GOOD.
Some answers here offer reduce(operator.add, [a, b])
for pairwise concatenation -- this is the same as sum([a, b], [])
only more wordy.
Any method that uses set
will drop duplicates and lose ordering. Use with caution.
for i in b: a.append(i)
is more wordy, and slower than a.extend(b)
, which is single function call and more idiomatic. append
is slower because of the semantics with which memory is allocated and grown for lists. See here for a similar discussion.
heapq.merge
will work, but its use case is for merging sorted lists in linear time. Using it in any other situation is an anti-pattern.
yield
ing list elements from a function is an acceptable method, but chain
does this faster and better (it has a code path in C, so it is fast).
operator.add(a, b)
is an acceptable functional equivalent to a + b
. It's use cases are mainly for dynamic method dispatch. Otherwise, prefer a + b
which is shorter and more readable, in my opinion. YMMV.