如何以“ pythonic”方式编写循环

时间:2019-06-26 17:48:30

标签: python

我想知道是否有一种“ python-ic”的方式来编写以下带有if语句的嵌套forloop:

nonelist = []

for i in testlist:
    for e in i:
        if e == None:
            nonelist.append(i)

2 个答案:

答案 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]