Ich habe eine Liste sieht wie folgt aus:wie man eine 2D-Liste auf 1D reduziert, ohne numpy zu verwenden?
[[1,2,3],[1,2],[1,4,5,6,7]]
und ich möchte es flach in [1,2,3,1,2,1,4,5,6,7]
gibt es eine leichte Funktion dieses numpy ohne zu tun?
Ich habe eine Liste sieht wie folgt aus:wie man eine 2D-Liste auf 1D reduziert, ohne numpy zu verwenden?
[[1,2,3],[1,2],[1,4,5,6,7]]
und ich möchte es flach in [1,2,3,1,2,1,4,5,6,7]
gibt es eine leichte Funktion dieses numpy ohne zu tun?
Ohne numpy (ndarray.flatten
) Sie können chain.from_iterable
verwenden, die für itertools.chain
ein alternativer Konstruktor ist:
>>> list(chain.from_iterable([[1,2,3],[1,2],[1,4,5,6,7]]))
[1, 2, 3, 1, 2, 1, 4, 5, 6, 7]
auch können Sie reduce
in Python 2 und functools.reduce
in 3, die für kurze Listen ist effizienter nutzen:
>>> 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]
Oder eine Liste Verständnis verwenden:
[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
Ein Benchmark auf @ Antwort Wills, die sum
verwendet (seine schnell für kurze Liste aber nicht lange Liste):
:~$ 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
Dies wird in Ihrem speziellen Fall arbeiten. Eine rekursive Funktion würde am besten funktionieren, wenn Sie mehrere Ebenen von verschachtelten Iterablen haben.
def flatten(input):
new_list = []
for i in input:
for j in i:
new_list.append(j)
return new_list
Dies ist die einzige Lösung, die tatsächlich für tief verschachtelte Listen funktioniert. – Johan
Für nur eine Liste wie diese, meine Lieblinge netter kleiner Trick ist nur sum
zu verwenden;
sum
hat ein optionales Argument: sum(iterable [, start])
, so können Sie tun:
list_of_lists = [[1,2,3], [4,5,6], [7,8,9]]
print sum(list_of_lists, []) # [1,2,3,4,5,6,7,8,9]
dies funktioniert, weil die +
Betreiber der Verkettungsoperator für Listen werden passiert, und Sie haben ihm gesagt, dass der Ausgangswert []
- eine leere Liste.
aber die documentaion für sum
empfiehlt, dass Sie stattdessen itertools.chain
verwenden, da es viel klarer ist.
Wie vergleicht sich 'sum ([[1,2,3], [4,5,6], [7,8,9]], []) mit diesen? – will
@will für kurze Listen ist es schneller als reduzieren, aber für längere Listen ist es nicht! – Kasramvd