过滤元组列表的列表

mk8*_*efz 4 python filter

我有一个元组列表列表:

oldList = [[(1,None),(2,45),(3,67)],[(1,None), (2,None), (3,None),(4,56),(5,78)],[(1, None),(2, 98)]]
Run Code Online (Sandbox Code Playgroud)

我想过滤"无"的任何实例:

newList = [[(2,45),(3,67)], [(4,56),(5,78)], [(2, 98)]]
Run Code Online (Sandbox Code Playgroud)

我最接近的是这个循环,但它不会丢弃整个元组(只有'None'),它也会破坏元组结构列表的列表:

newList = []
for data in oldList:
    for point in data:
        newList.append(filter(None,point))
Run Code Online (Sandbox Code Playgroud)

use*_*471 7

最简单的方法是使用嵌套列表理解:

>>> newList = [[t for t in l if None not in t] for l in oldList]
>>> newList
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]]
Run Code Online (Sandbox Code Playgroud)

您需要嵌套两个列表推导,因为您正在处理列表列表.列表[[...] for l in oldList]推导的外部部分负责迭代包含的每个内部列表的外部列表.然后在你的内部列表理解中[t for t in l if None not in t],这是一种非常直接的方式,表示你希望列表中的每个元组都不包含None.

(可以说,您应该选择比l和更好的名称t,但这取决于您的问题域.我选择了单字母名称来更好地突出代码的结构.)

如果您对列表推导不熟悉或不舒服,这在逻辑上等同于以下内容:

>>> newList = []
>>> for l in oldList:
...     temp = []
...     for t in l:
...         if None not in t:
...             temp.append(t)
...     newList.append(temp)
...
>>> newList
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]]
Run Code Online (Sandbox Code Playgroud)