我有一个长度相同的列表列表,例如
[
[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万时,迭代需要很长时间
答案 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
将给出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)
答案 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)