how to remove an element from a nested list?

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.


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")

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

Tags:

Python