代码之家  ›  专栏  ›  技术社区  ›  dimButTries

基于上一次迭代更新列表中的False值

  •  0
  • dimButTries  · 技术社区  · 2 年前

    我有一个列表:

    ['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]
    

    当我浏览每一行时,我会查看当前项目是否 False 如果前一行中的项目(相同位置)不是 错误 ,我将用上一个项目替换当前项目。

    因此,新的列表将是:

    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],
    ]
    

    这是我的代码:

    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)
    

    它错误地输出:

    ['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]
    

    为什么它只修改了两个值?如果 错误 值被替换了,在下一次迭代中,它似乎不知道它变了?例如:

    ['col1', 'col2', 'col3a', False, False, False] 
    ['col1', False, 'col3b', False, False, False]
    

    为什么第二个列表中的第一个项目不知道 'col2' 已更新,因此使用它来替换 错误 处于其位置?

    1 回复  |  直到 2 年前
        1
  •  1
  •   sdawar    2 年前

    这里,当我们计算上一个值时,我从display_list而不是list_of_lists中获取它(因为display_lists现在将具有更新的值)

    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)
    

    这导致以下结果

    ['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]