Without NumPy (ndarray.flatten
), bạn có thể sử dụng chain.from_iterable
đó là một nhà xây dựng thay thế cho itertools.chain
:
>>> list(chain.from_iterable([[1,2,3],[1,2],[1,4,5,6,7]]))
[1, 2, 3, 1, 2, 1, 4, 5, 6, 7]
bạn cũng có thể sử dụng reduce
trong python 2 và functools.reduce
trong 3 đó là hiệu quả hơn cho các danh sách ngắn:
>>> reduce(lambda x,y :x+y ,[[1,2,3],[1,2],[1,4,5,6,7]])
[1, 2, 3, 1, 2, 1, 4, 5, 6, 7]
Hoặc sử dụng một danh sách hiểu:
[j for i in [[1,2,3],[1,2],[1,4,5,6,7]] for j in i]
benchmark:
:~$ python -m timeit "from itertools import chain;chain.from_iterable([[1,2,3],[1,2],[1,4,5,6,7]])"
1000000 loops, best of 3: 1.58 usec per loop
:~$ python -m timeit "reduce(lambda x,y :x+y ,[[1,2,3],[1,2],[1,4,5,6,7]])"
1000000 loops, best of 3: 0.791 usec per loop
:~$ python -m timeit "[j for i in [[1,2,3],[1,2],[1,4,5,6,7]] for j in i]"
1000000 loops, best of 3: 0.784 usec per loop
Một benchmark trên @ câu trả lời của Will rằng sử dụng sum
(nhanh của nó đối với danh sách ngắn nhưng không phải cho danh sách dài):
:~$ python -m timeit "sum([[1,2,3],[4,5,6],[7,8,9]], [])"
1000000 loops, best of 3: 0.575 usec per loop
:~$ python -m timeit "sum([range(100),range(100)], [])"
100000 loops, best of 3: 2.27 usec per loop
:~$ python -m timeit "reduce(lambda x,y :x+y ,[range(100),range(100)])"
100000 loops, best of 3: 2.1 usec per loop
cách tính tổng ([[1,2,3], [4,5,6], [7,8,9]], []) 'so sánh với các giá trị này? – will
@will cho danh sách ngắn nhanh hơn giảm nhưng đối với danh sách dài hơn thì không! – Kasramvd