2010-06-16 4 views
4

si j'ai une liste imbriquée tels que:comment supprimer un élément d'une liste imbriquée?

m=[[34,345,232],[23,343,342]] 

si j'écris m.remove(345) lui donne un message d'erreur indiquant que l'élément pas dans la liste.

Je veux savoir comment supprimer un élément de la liste imbriquée, facilement?

+0

dupe. exactement la même question a été posée il y a quelques jours. – SilentGhost

+0

@SilentGhost: S'il vous plaît poster le lien dans votre commentaire pointant vers cette question. – VoodooChild

+2

oui s'il vous plaît donner le lien de la question en double, je peux obtenir quelques suggestions de cela aussi – kaki

Répondre

4

Il n'y a pas de raccourci pour cela. Vous devez supprimer la valeur de chaque liste imbriquée dans la liste des conteneurs:

for L in m: 
    try: 
     L.remove(345) 
    except ValueError: 
     pass 

Si vous voulez un comportement similaire comme list.remove, utilisez quelque chose comme ce qui suit:

def remove_nested(L, x): 
    for S in L: 
     try: 
      S.remove(x) 
     except ValueError: 
      pass 
     else: 
      break # Value was found and removed 
    else: 
     raise ValueError("remove_nested(L, x): x not in nested list") 
2
In [5]: m=[[34,345,232],[23,343,342]] 

In [7]: [[ subelt for subelt in elt if subelt != 345 ] for elt in m] 
Out[7]: [[34, 232], [23, 343, 342]] 

Notez que remove(345) seulement supprime la première occurrence de 345 (si elle existe). Le code ci-dessus supprime toutes les occurences de 345.

1
i=0 
for item in nodes: 
    for itm in item: 
     m=database_index[itm] 
     print m 
     if m[1]=='text0526' or m[1]=='text0194' or m[1]=='phone0526' or m[1]=='phone0194': 
      nodes[i].remove(itm) 
    i+=1 

ce i comment je résolu mon problème en utilisant une variable i pour enregistrer le niveau au-dessus de la liste imbriquée.

+0

Au lieu d'utiliser une variable explicite 'i', vous pouvez aussi utiliser le wrapper' enumerate() ':' pour i, item dans enumerate (nodes): ' –

1

Si vous avez plus d'un niveau imbriqué cela pourrait aider

def nested_remove(L, x): 
    if x in L: 
     L.remove(x) 
    else: 
     for element in L: 
      if type(element) is list: 
       nested_remove(element, x) 

>>> m=[[34,345,232],[23,343,342]] 
>>> nested_remove(m, 345) 
>>> m 
[[34, 232], [23, 343, 342]] 

>>> m=[[34,[345,56,78],232],[23,343,342]] 
>>> nested_remove(m, 345) 
>>> m 
[[34, [56, 78], 232], [23, 343, 342]] 
Questions connexes