您知道一种更好的创建[1,0,0,1,0,...]之类的过滤器的方法吗

时间:2019-06-06 14:53:12

标签: 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个列表并设置0 if None else 1

我为此找到了解决方案,但我认为它可以更轻松地完成

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万时,迭代需要很长时间

2 个答案:

答案 0 :(得分:3)

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

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将给出TrueFalse的矩阵。然后将它们逐行求和(或运算),然后从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)

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