tags:

views:

86

answers:

4

if i have an nested list such as:

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

if i write m.remove(345) it gives an error message saying element not in the list.

i want to know how to remove an element from the nested list,easily??

+3  A: 

There is no shortcut for this. You have to remove the value from every nested list in the container list:

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

If you want similiar behavior like list.remove, use something like the following:

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")
Ferdinand Beyer
+2  A: 
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]]

Note that remove(345) only removes the first occurrance of of 345 (if it exists). The above code removes all occurrances of 345.

unutbu
A: 
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

this i how i solved my problem by using a variable i to save the above level of the nested list.

kaki
Instead of using an explicit variable `i`, you could also use the `enumerate()` wrapper: `for i, item in enumerate(nodes):`
Ferdinand Beyer
A: 

If you have more than one nested level this could help

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