AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77553830
Accepted
dimButTries
dimButTries
Asked: 2023-11-27 07:16:30 +0800 CST2023-11-27 07:16:30 +0800 CST 2023-11-27 07:16:30 +0800 CST

Atualizando valores falsos em uma lista com base na iteração anterior

  • 772

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 é Falsee 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 Falsevalor 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 Falseem sua posição?

python
  • 3 3 respostas
  • 95 Views

3 respostas

  • Voted
  1. Best Answer
    inferno
    2023-11-27T07:52:52+08:002023-11-27T07:52:52+08:00

    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)

    list_of_lists = [
        ['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]
    ]
    
    display_list = [[val for val in list_of_lists[0]]] # add the first row
    for row_num in range(1, len(list_of_lists)): # from row 2 to end
        tmp_row = [] # for temporarily saving the updated row
        for col_num in range(len(list_of_lists[row_num])):
            current_cell = list_of_lists[row_num][col_num] # get current row from list_of_lists
            previous_cell = display_list[row_num - 1][col_num] # get previous row from display_list
            if current_cell is False and previous_cell: # pytonic way to check for falsy or truthy value
                tmp_row.append(previous_cell)
            else:
                tmp_row.append(current_cell)
        display_list.append(tmp_row) # append the tmp_row
    
    for row in display_list:
        print(row)
    

    Isso resulta no seguinte resultado

    ['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]
    
    • 1
  2. blhsing
    2023-11-27T16:22:45+08:002023-11-27T16:22:45+08:00

    Você pode atribuir a uma Falsecé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:

    for row in range(1, len(list_of_lists)):
        for col, value in enumerate(lst := list_of_lists[row]):
            if value is False:
                lst[col] = list_of_lists[row - 1][col]
    

    Demonstração: aqui

    O pode ser mais legível usando itertools.pairwisepara iterar linhas com suas respectivas linhas anteriores:

    from itertools import pairwise
    
    for prev, lst in pairwise(list_of_lists):
        for pos, value in enumerate(lst):
            if value is False:
                lst[pos] = prev[pos]
    

    Demonstração: aqui

    • 1
  3. Reilas
    2023-11-27T10:36:07+08:002023-11-27T10:36:07+08:00

    Aqui está um exemplo, onde a é a lista.

    for i in range(1, len(a)):
        r = a[i - 1]
        for j in range(len(r)):
            if v := r[j]: a[i][j] = v
    

    Saída

    [['col1', False, False, False, False, False],
     ['col1', 'col2', False, False, False, False],
     ['col1', 'col2', 'col3a', False, False, False],
     ['col1', 'col2', 'col3a', False, False, False],
     ['col1', 'col2', 'col3a', 'col4', False, False],
     ['col1', 'col2', 'col3a', 'col4', False, False]]
    
    • -2

relate perguntas

  • Como divido o loop for em 3 quadros de dados individuais?

  • Como verificar se todas as colunas flutuantes em um Pandas DataFrame são aproximadamente iguais ou próximas

  • Como funciona o "load_dataset", já que não está detectando arquivos de exemplo?

  • Por que a comparação de string pandas.eval() retorna False

  • Python tkinter/ ttkboostrap dateentry não funciona quando no estado somente leitura

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve