我想知道是否有一种“ python-ic”的方式来编写以下带有if语句的嵌套forloop:
nonelist = []
for i in testlist:
for e in i:
if e == None:
nonelist.append(i)
答案 0 :(得分:4)
您可以使用itertools.chain
生成平面迭代器,然后从那里检查项目是否为None
:
[i for i in itertools.chain.from_iterable(testlist) if i is None]
示例:
In [389]: testlist = [[1, 2, 3, None], [4, 5, None, None]]
In [390]: [i for i in itertools.chain.from_iterable(testlist) if i is None]
Out[390]: [None, None, None]
FWIW None
是单例,因此您应该对它们使用同一性(is
)测试,而不是等式测试(==
)。
答案 1 :(得分:3)
根据特定的应用程序,可能会有更好的逻辑。但是,对于您的抽象问题,使用直接构造将更加Pythonic:*“列表理解”。
nonelist = [i for i in testlist if any([e is None for e in i]) ]
这与您的代码不同 :如果None
中有多个i
值,那么您的代码每次出现都会附加i
;我只添加了一次。
@奥斯丁的进步:
nonelist = [i for i in testlist if None in i]