我有以下输入列表
A = [['A',[1,2,3]],['D',[3,4]],['E',[6,7]],['F',[1]]]
我想要长度为 2 的子列表。在上面的示例中,我想删除 [A,[1,2,3]], [F,[1]] 等我正在创建一个新列表并附加其所有子列表长度 ==2。如果我可以直接从 A 中删除不需要的子列表,那将是理想的
不应该是这样吗?
A = [x for x in A if len(x[1]) == 2]
甚至
A = [[a, b] for a, b in A if len(b) == 2]
您可能想要使用过滤器。
filter(lambda x: len(x[1]) == 2, A)
这假设每个元素(列表)有 2 个元素,第二个元素是一个列表。您想要过滤在此内部列表中恰好有 2 个元素的元素。
更多关于过滤器:
filter(...) filter(function or None, sequence) -> list, tuple, or string
Return those items of sequence for which function(item) is true.
[x for x in A if len(x[1]) == 2]
创建一个新的过滤列表会更好也更容易。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]]]
原地删除通常效率低下,因为每次删除一项时,您都需要将剩余的项目向下移动。当您从正在迭代的列表中删除时,您还需要注意不要跳过元素。
A = [x if len(x)==2 for x in A]
仅供参考,您的 E 和 F 列表没有右括号,但我假设这只是复制/粘贴错误或类似错误。