0

我有以下输入列表

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

我想要长度为 2 的子列表。在上面的示例中,我想删除 [A,[1,2,3]], [F,[1]] 等我正在创建一个新列表并附加其所有子列表长度 ==2。如果我可以直接从 A 中删除不需要的子列表,那将是理想的

4

4 回答 4

2

不应该是这样吗?

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

甚至

A = [[a, b] for a, b in A if len(b) == 2]
于 2013-01-31T00:38:02.623 回答
1

您可能想要使用过滤器。

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]

于 2013-01-31T00:38:16.290 回答
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]]]

原地删除通常效率低下,因为每次删除一项时,您都需要将剩余的项目向下移动。当您从正在迭代的列表中删除时,您还需要注意不要跳过元素。

于 2013-01-31T00:53:17.687 回答
0
A = [x if len(x)==2 for x in A]

仅供参考,您的 E 和 F 列表没有右括号,但我假设这只是复制/粘贴错误或类似错误。

于 2013-01-31T00:36:34.783 回答