Знаете ли вы лучший способ создать фильтр, как [1,0,0,1,0, ...] - PullRequest
0 голосов
/ 06 июня 2019

У меня есть список списков одинаковой длины, например

[
    [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 списков с 1 миллионом + значений в каждом списке

Ответы [ 2 ]

3 голосов
/ 06 июня 2019

Если вы не хотите использовать 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)
0 голосов
/ 06 июня 2019

если вы хотите использовать 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)
...