如何根据长度在Python中移除嵌套列表?
我有一个这样的输入列表:
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]