如何从嵌套列表中删除元素?

7 投票
10 回答
25828 浏览
提问于 2025-04-16 00:03

如果我有一个嵌套列表,比如:

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

如果我写 m.remove(345),它会给我一个错误提示,说这个元素不在列表里。

我想知道怎么才能简单地从这个嵌套列表中删除一个元素。

10 个回答

2

如果你有多个嵌套层级,这个可能会对你有帮助。

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

6

这个没有捷径可走。你必须从容器列表中的每一个嵌套列表里都把值删除掉:

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

撰写回答