我有一个元组列表列表:
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)
最简单的方法是使用嵌套列表理解:
>>> 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)
| 归档时间: |
|
| 查看次数: |
547 次 |
| 最近记录: |