2010-06-16 124 views
4

,如果我有一个嵌套列表,例如:如何从嵌套列表中删除元素?

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

如果我写m.remove(345)它提供了一条错误消息,元素不在列表中。

我想知道如何从嵌套列表中删除一个元素,很容易?

+0

欺骗。几天前问完全相同的问题。 – SilentGhost 2010-06-16 16:44:40

+0

@SilentGhost:请在您的评论中指出该问题的链接。 – VoodooChild 2010-06-16 16:47:21

+2

是的请给予重复问题的链接,我可能也从中得到一些建议 – kaki 2010-06-16 16:55:44

回答

4

这没有捷径。你必须从每一个嵌套列表容器列表中删除值:

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

如果你想要一个像list.remove类似的操作,使用类似以下内容:

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]] 

请注意,只有remove(345)消除345的第一次出现(如果存在)。上面的代码删除所有发生的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 

这我我是如何解决我的问题,通过使用变量我保存上述级别的嵌套列表。

+0

而不是使用显式变量'i',你也可以使用'enumerate()'wrapper:'for i,item in enumerate(nodes):' – 2010-06-21 20:44:47

1

如果你有一个以上的嵌套级别,这可能有助于

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]]