Имейте понимание списка с одной линией:
data = [1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0]
indices = [0, 1, 2, 3, 4, 5, 6, 7]
nearest_true = [next(v for v in range(ind, -1, -1) if data[v]) for ind in indices]
Для каждого индекса в массиве индексов next
пересекает массив данных в обратном направлении, начиная с этого индекса, и возвращает первый индекс для массива данных, который содержит истинное значение.
Однако, как обсуждалось в комментариях, этот код не работал бы, если бы у какого-либо индекса не было хотя бы одного истинного значения в нем или позади него. Мы можем решить эту проблему, предоставив значение по умолчанию для next()
, передав его в качестве второго параметра, в этом случае нам придется заключить генератор в скобки, поскольку он больше не является единственным аргументом:
NOT_FOUND = -1
nearest_true = [next((v for v in range(ind, -1, -1) if data[v]), NOT_FOUND)
for ind in indices]
Тогда вывод для data = [0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0]
будет [-1, -1, -1, 3, 4, 5, 5, 7]