2015-03-24 2 views

Antwort

17

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 
+0

Wie vergleicht sich 'sum ([[1,2,3], [4,5,6], [7,8,9]], []) mit diesen? – will

+0

@will für kurze Listen ist es schneller als reduzieren, aber für längere Listen ist es nicht! – Kasramvd

1

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 
+0

Dies ist die einzige Lösung, die tatsächlich für tief verschachtelte Listen funktioniert. – Johan

9

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.

+0

Wie auch immer, es ist eine gute Antwort! – Kasramvd

+0

wie für die Liste der Zeichenfolgen zu tun? – pyd

+0

@pyd der Code oben funktioniert für jeden Objekttyp ... warum nicht testen, bevor Sie fragen? – will

Verwandte Themen