如何根据长度在Python中移除嵌套列表?

0 投票
4 回答
1488 浏览
提问于 2025-04-17 14:16

我有一个这样的输入列表:

A = [['A',[1,2,3]],['D',[3,4]],['E',[6,7]],['F',[1]]]

我想要得到长度为2的子列表。
在上面的例子中,我想去掉像 [A,[1,2,3]]、[F,[1]] 这样的子列表。
我正在创建一个新的列表,把所有长度为2的子列表添加进去。
如果我能直接从A中去掉那些不需要的子列表,那就最好不过了。

4 个回答

1

创建一个新的过滤列表通常更好也更简单。A[:] = ... 是一种切片赋值,这意味着新列表的内容会被复制回 A 中,这样其他指向同一个列表的地方也能看到这个更新。如果你不需要保持 A 的身份,可以直接用 A = ...

>>> A = [['A',[1,2,3]],['D',[3,4]],['E',[6,7]],['F',[1]]]
>>> A[:] = [x for x in A if len(x[1]) == 2]
>>> A
[['D', [3, 4]], ['E', [6, 7]]]

就地删除通常效率不高,因为每次删除一个元素时,你都需要把剩下的项目往前移动。而且在你遍历列表时删除元素时,还要小心不要跳过某些元素。

1

你可能想用过滤器。

filter(lambda x: len(x[1]) == 2, A)

这里假设每个元素(列表)都有两个部分,第二部分是一个列表。你想要过滤出那些内部列表恰好有两个元素的部分。

关于过滤器的更多信息:

filter(...) filter(函数或None, 序列) -> 列表、元组或字符串

Return those items of sequence for which function(item) is true.


同样的效果也可以通过列表推导式来实现:

[x for x in A if len(x[1]) == 2]

3

难道不应该是这样吗?

A = [x for x in A if len(x[1]) == 2]

或者甚至可以这样

A = [[a, b] for a, b in A if len(b) == 2]

撰写回答