2016-08-22 3 views
-2

Aus einer Liste, M:Wie kann ich eine Funktion auf jedes Element einer verschachtelten Liste anwenden?

M = [[1, 2, 3], 
    [4, 5, 6], 
    [7, 8, 9]] 

Ich mag eine neue Liste, L, schaffen, mit allen Elementen verdoppelt.

Bisher habe ich verschiedene Kombinationen von Iteration, Comprehensions und Lambda-Ausdrücke ausprobiert, alles ohne Erfolg.

Was wäre der einfachste/schnellste Weg?

+4

'[[x * 2 für x in r] für r in M]'? – soon

+0

[Reduzieren Sie die Liste der Listen] (https://stackoverflow.com/questions/952914), führen Sie dann Ihre Operation für jedes Element der flachen Liste aus. –

+1

@ KevinJ.Chase: Die Antworten haben bisher angenommen, dass die neue Liste 'L' die gleiche Struktur wie' M' haben wird (nicht abgeflacht). –

Antwort

4

Ein verschachtelte Liste Verständnis tun:

double_M = [[2 * x for x in inner] for inner in M ] 
>> [[2, 4, 6], [8, 10, 12], [14, 16, 18]] 
+0

Sie haben eine streunende Klammer. –

+0

@StevenRumbalski Danke, habe es behoben. – DeepSpace

3

Im Fall, wenn Sie numpy verwenden, könnten Sie die gesamte Matrix einfach doppelt:

In [1]: import numpy as np 

In [2]: M = [[1, 2, 3], 
    ...:  [4, 5, 6], 
    ...:  [7, 8, 9]] 

In [3]: np.array(M) * 2 
Out[3]: 
array([[ 2, 4, 6], 
     [ 8, 10, 12], 
     [14, 16, 18]]) 
-1

Hier ist ein kleiner Maßstab für feste 3x3 Matrizen :

import numpy as np 
import timeit 

M = [[1, 2, 3], 
    [4, 5, 6], 
    [7, 8, 9]] 


def f1(M): 
    return [[x * 2 for x in r] for r in M] 


def f2(M): 
    return np.array(M) * 2 

K=1000000 
print(timeit.timeit('f1(M)', setup='from __main__ import f1, M', number=K)) 
print(timeit.timeit('f2(M)', setup='from __main__ import f2, M', number=K)) 

# 1.886869086403203 
# 3.470187123186767 
# [Finished in 5.6s] 

würde ich sagen, f1 eine gute Wahl in Bezug auf die Geschwindigkeit ist

+0

Wahrscheinlicher Grund ist die Konvertierung in np.array in f2, während f1 die Standard-Python-Liste zurückgibt. Wenn Sie die Konvertierung ('np.array (***)') in f1 hinzufügen, wird das Ergebnis sogar langsamer als in f2 sein –

Verwandte Themen