Python 你知道一种更好的方法来创建像[1,0,0,1,0,…]这样的过滤器吗

Python 你知道一种更好的方法来创建像[1,0,0,1,0,…]这样的过滤器吗,python,filter,zip,nonetype,Python,Filter,Zip,Nonetype,例如,我有一个相同长度的列表 [ [23,12,23,1,32,None,12,None], [None,456,2,None,4,545,56,12], [435,None,4,3,None,44,12,23] ] 现在我想创建一个最终模式,如: [0,0,1,1,0,1,0]-->类似于压缩所有3个列表,如果没有其他1个列表,则设置0 我有一个解决方案,但我认为可以做得更容易 filter_by_nones = [1] * len(lists_for_filteri

例如,我有一个相同长度的列表

[
    [23,12,23,1,32,None,12,None],
    [None,456,2,None,4,545,56,12],
    [435,None,4,3,None,44,12,23]
]
现在我想创建一个最终模式,如:

[0,0,1,1,0,1,0]
-->类似于压缩所有3个列表,如果没有其他1个列表,则设置
0

我有一个解决方案,但我认为可以做得更容易

filter_by_nones = [1] * len(lists_for_filtering[0])
for list_of_values in lists_for_filtering:
    temp_pattern = []
    [temp_pattern.append(1) if value is not None else temp_pattern.append(0)
     for value in list_of_values]
    filter_by_nones = [a * b for a, b in zip(temp_pattern, filter_by_nones)]

我考虑以某种方式使用python过滤器函数,因为当一个列表包含10个列表,每个列表中有100多万个以上的值时-->迭代需要很长时间

如果不想使用NumPy,可以使用
all
和列表理解。
zip
将按索引对元素进行分组,如果没有元素
None
all
将为
True
,反之亦然

lst = [[23,12,23,1,32,None,12,None],
       [None,456,2,None,4,545,56,12],
       [435,None,4,3,None,44,12,23] ]

answer = [int(all(sub)) for sub in zip(*lst)]
# [0, 0, 1, 0, 0, 0, 1, 0]
NumPy解决方案
lst==None
将给出一个矩阵
True
False
。然后按行求和(或运算),然后从1中减去得到最终答案

lst = np.array([[23,12,23,1,32,None,12,None],
                [None,456,2,None,4,545,56,12],
                [435,None,4,3,None,44,12,23] ])

answer = 1-(lst==None).sum(axis=0)

如果不想使用NumPy,可以使用
all
和列表理解。
zip
将按索引对元素进行分组,如果没有元素
None
all
将为
True
,反之亦然

lst = [[23,12,23,1,32,None,12,None],
       [None,456,2,None,4,545,56,12],
       [435,None,4,3,None,44,12,23] ]

answer = [int(all(sub)) for sub in zip(*lst)]
# [0, 0, 1, 0, 0, 0, 1, 0]
NumPy解决方案
lst==None
将给出一个矩阵
True
False
。然后按行求和(或运算),然后从1中减去得到最终答案

lst = np.array([[23,12,23,1,32,None,12,None],
                [None,456,2,None,4,545,56,12],
                [435,None,4,3,None,44,12,23] ])

answer = 1-(lst==None).sum(axis=0)

如果你想使用numpy,你可以这样做


x =    [[23,12,23,1,32,None,12,None],
       [None,456,2,None,4,545,56,12],
       [435,None,4,3,None,44,12,23] ]
mask  = np.where(np.logical_and.reduce(x) != None , 1 , 0)

如果你想使用numpy,你可以这样做


x =    [[23,12,23,1,32,None,12,None],
       [None,456,2,None,4,545,56,12],
       [435,None,4,3,None,44,12,23] ]
mask  = np.where(np.logical_and.reduce(x) != None , 1 , 0)

这对于像
numpy
这样的库来说非常简单。使用它有什么限制吗?最后它应该是一个python列表。因此,最后使用.tolist()是可以的。您是否研究过
itertools.compress()
?这对于
numpy
这样的库非常简单。使用它有什么限制吗?最后它应该是一个python列表。因此,最后使用.tolist()是可以的。您是否查看了
itertools.compress()
all(sub)
您的意思是它还删除了整数0。如何使其仅删除None?
all(sub)
您的意思是它还删除整数0。如何使它只删除无的?