在嵌套循环中传递'None'时,避免“'NoneType'对象不可迭代”错误

时间:2017-10-24 16:05:58

标签: python

我正在尝试将三个列表传递给一个函数,然后迭代列表中的所有值,然后将它们激活到另一个函数中:

def main():
    l1 = [0,1]
    l2 = [1,5,10,20]
    l3 = [15]

    my_func(l1,l2,l3)

def my_func(l1, l2, l3):
    nested = ((x,y,x) for x in l1 for y in l2 for z in l3)
    for x,y,z in nested:
        another_func(x,y,z)

def another_func(x,y,z):
    ...

但偶尔我需要传入一个None值作为其中一个列表:

l3 = None

这导致错误: TypeError:'NoneType'对象不可迭代,因为它在尝试迭代时不喜欢None值。

我想知道如果它们的值为None,是否有任何方法可以从迭代中排除列表?

2 个答案:

答案 0 :(得分:1)

在这里,我浏览了所有列表,将None替换为(None,),这是一个元组,因此是可迭代的

from itertools import repeat, product

def my_func(*lists):
    for group in product(*(l if l is not None else (None,) for l in lists)):
        another_func(*group)

答案 1 :(得分:0)

所以我认为我正在寻找的是:

list(itertools.product(*filter(None, (a,b,c))))

这将遍历所有可能的迭代并过滤无的列表。