2010-12-06 17 views
1

Wie werden verschachtelte Listen in Python behandelt? Ich habe Probleme, die Syntax herauszufinden. Wie Beispiel:Ändern verschachtelter Listen

>>> l = [[1, 2, 3], [5, 6, 7]] 

Ich möchte in dieser Liste alle Elemente zu quadrieren. Ich habe versucht:

[m*m for m in l] 

Aber das funktioniert nicht und wirft:

TypeError: can't multiply sequence by non-int of type 'list'

wegen der verschachtelten Listen ich denke?

Wie behebe ich das?

Antwort

7
>>> l = [[1, 2, 3], [5, 6, 7]] 
>>> [[e*e for e in m] for m in l] 
    |-nested list-| 
    |---- complete list ---| 
[[1, 4, 9], [25, 36, 49]] 
+0

+1 für die erste :) – khachik

+0

Danke! Manchmal hat man Glück. – user225312

+0

+1 für die List-comp und für ASCII-Art;) – Ant

1
[[1,2,3],[4,5,6]] != [1,2,3,4,5,6]  

[map(lambda x: x *x,sl) for sl in l] #List comprhension 
+0

Ich vermeide Lambda wo immer ich kann! Aber +1. – user225312

0

Was Sie brauchen, ist eine rekursive Funktion, so etwas wie dieses:

def square(el): 
    if type(el) == list: 
     return [square(x) for x in el] 
    else: 
     return el**2; 

Ich möchte lieber nicht in die Richtigkeit der type(el) == list hier, aber Sie den Kern erhalten.

Natürlich ist dies auch mit einer Liste Verständnis möglich, da viele Leute Zeiger haben, vorausgesetzt, dass die Struktur immer gleich ist. Diese rekursive Funktion kann jede Rekursionsebene und Listen mit Listen und Zahlen verarbeiten.

+0

Rekursion ist für Bäume unterschiedlicher Tiefe von unschätzbarem Wert, wird hier aber vermutlich nicht benötigt. – delnan

0

Angenommen, Sie die Antwort auf so aussehen wollte:

[[1, 4, 9], [25, 36, 49]] 

Sie so etwas tun könnte:

l = [[1, 2, 3], [5, 6, 7]] 

for x in range(len(l)): 
    for y in range(len(l[x])): 
     l[x][y] = l[x][y] * l[x][y] 

print l 

Offensichtlich ist die Liste Verständnis Antwort besser ist.

Verwandte Themen