2010-12-06 6 views
1

Comment gérer les listes imbriquées en Python? J'ai un problème pour trouver la syntaxe. Comme exemple:Modification de listes imbriquées

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

Je veux placer tous les éléments dans cette liste. J'ai essayé:

[m*m for m in l] 

Mais cela ne fonctionne pas et vomit:

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

en raison des listes imbriquées, je suppose?

Comment résoudre ce problème?

Répondre

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 d'être le premier :) – khachik

+0

Merci! Parfois, on a de la chance. – user225312

+0

+1 pour la liste-comp et pour l'art ascii;) – 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

J'évite volontiers lambda partout où je peux! Mais +1. – user225312

0

Qu'est-ce que vous avez besoin est une fonction récursive, quelque chose comme ceci:

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

Je préfère ne pas obtenir dans l'exactitude de type(el) == list ici, mais vous obtenez l'essentiel.

Bien sûr, cela est également possible avec une compréhension de liste, comme beaucoup de gens l'ont indiqué, à condition que la structure soit toujours la même. Cette fonction récursive peut gérer n'importe quel niveau de récursivité et les listes contenant à la fois des listes et des nombres.

+0

La récursion est inestimable pour les arbres de profondeur variable, mais probablement pas nécessaire ici. – delnan

0

En supposant que vous vouliez la réponse à ressembler à ceci:

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

Vous pouvez faire quelque chose comme ceci:

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 

De toute évidence, la réponse de la compréhension de la liste est meilleure.

Questions connexes