Eu tenho uma lista de listas:
['col1', False, False, False, False, False]
['col1', 'col2', False, False, False, False]
['col1', False, 'col3a', False, False, False]
['col1', False, 'col3b', False, False, False]
['col1', False, False, 'col4', False, False]
['col1', False, False, 'col4', False, False]
À medida que passo por cada linha, procuro ver se o item atual é False
e se o item da linha anterior (mesma posição) não é False
, substituirei o item atual pelo anterior.
Portanto, a nova lista de listas seria:
list_of_lists = [
['col1', False, False, False, False, False],
['col1', 'col2', False, False, False, False],
['col1', 'col2', 'col3a', False, False, False],
['col1', 'col2', 'col3b', False, False, False],
['col1', 'col2', 'col3b', 'col4', False, False],
['col1', 'col2', 'col3b', 'col4', False, False],
]
Aqui está o meu código:
for row_num in range(len(list_of_lists)):
display_list = []
if row_num == 0:
continue
for col_num in range(len(list_of_lists[row_num])):
current_row = list_of_lists[row_num][col_num]
previous_row = list_of_lists[row_num - 1][col_num]
if current_row == False and previous_row != False:
display_list.append(previous_row)
else:
display_list.append(current_row)
print(display_list)
Ele gera incorretamente:
['col1', False, False, False, False, False]
['col1', 'col2', False, False, False, False]
['col1', 'col2', 'col3a', False, False, False]
['col1', False, 'col3b', False, False, False]
['col1', False, 'col3b', 'col4', False, False]
['col1', False, False, 'col4', False, False]
Por que está revisando apenas dois valores? Se um False
valor foi substituído, na próxima iteração parece que ele não sabe que mudou? Por exemplo:
['col1', 'col2', 'col3a', False, False, False]
['col1', False, 'col3b', False, False, False]
Por que o 1º item da 2ª lista não sabe 'col2'
que foi atualizado, portanto, utiliza-o para substituir o False
em sua posição?
Aqui, quando calculamos o valor anterior, estou retirando-o de display_list em vez de list_of_lists (já que display_list agora teria os valores atualizados)
Isso resulta no seguinte resultado
Você pode atribuir a uma
False
célula o valor da mesma coluna da linha anterior, começando pela linha do índice 1, pois não há linha anterior para uma linha do índice 0:Demonstração: aqui
O pode ser mais legível usando
itertools.pairwise
para iterar linhas com suas respectivas linhas anteriores:Demonstração: aqui
Aqui está um exemplo, onde a é a lista.
Saída