如何在列表中进行类似填写的过程?

xtfmy6hx  于 2022-10-22  发布在  Python
关注(0)|答案(2)|浏览(124)

我有下面的列表aNone值,我想对它们进行“填充”。

a = [
        ['A','B','C','D'],
        [None,None,2,None],
        [None,1,None,None],
        [None,None,8,None],
        ['W','R',5,'Q'],
        ['H','S','X','V'],
        [None,None,None,7]
    ]

预期输出如下:

b = [
        ['A','B','C','D'],
        ['A','B',2,'D'],
        ['A',1,'C','D'],
        ['A','B',8,'D'],
        ['W','R',5,'Q'],
        ['H','S','X','V'],
        ['H','S','X',7]
    ]

我能够编写下一个代码,并且似乎可以工作,但我想知道是否有内置方法或更直接的方法来完成它。我知道使用panda有类似的东西,但需要转换为 Dataframe ,我想继续使用list,如果可能,只更新a列表,如果无法修改a,则在b中获取输出。谢谢

b = []
for z in a:
    if None in z:
        b.append([temp[i] if value == None else value for i, value in enumerate(z) ])
    else:
        b.append(z)
        temp = z
bqjvbblv

bqjvbblv1#

你可以用列表来理解这个问题,但我不确定它是否已经为你的解决方案增加了很多。

b = [a[0]]
for a_row in a[1:]:
    b.append([i if i else j for i,j in zip(a_row, b[-1])])

我不确定这是否是设计的,但在你的例子中,一个数字永远不会向下移动到下一行。如果你想确保只携带字母,可以通过跟踪每个位置上最后看到的字母来添加。假设a的第一行总是字母,那么;

last_seen_letters = a[0]
b = []
for a_row in a:
    b.append(b_row := [i if i else j for i,j in zip(a_row, last_seen_letters)])
    last_seen_letters = [i if isinstance(i, str) else j for i,j in zip(b_row, last_seen_letters)]
icnyk63a

icnyk63a2#

首先,考虑将“填充”到一行的过程。我们有两行作为输入:上面的行和下面的行;我们想要consider elements from the two lists pairwise。对于每一对,我们的输出由简单的逻辑确定-如果第二个值is None,则使用第一个值,否则使用第二个数值:

def fill_down_new_cell(above, current):
    return above if current is None else current

然后我们在成对迭代中apply to each pair

def fill_down_new_row(above, current):
    return [fill_down_new_cell(a, c) for a, c in zip(above, current)]

接下来,我们需要从原始列表中删除consider overlapping pairs行。每次,我们将“当前”行的replace the contentsfill_down_row结果进行比较,将它们分配给整个列表。通过这种方式,我们可以优雅地就地更新行列表,这允许更改传播到下一次迭代。因此:

def fill_down_inplace(rows):
    for above, current in zip(rows, rows[1:]):
        current[:] = fill_down_new_row(above, current)

让我们测试一下:

>>> a = [
...         ['A','B','C','D'],
...         [None,None,2,None],
...         [None,1,None,None],
...         [None,None,8,None],
...         ['W','R',5,'Q'],
...         ['H','S','X','V'],
...         [None,None,None,7]
...     ]
>>> fill_down_inplace(a)
>>> import pprint
>>> pprint.pprint(a)
[['A', 'B', 'C', 'D'],
 ['A', 'B', 2, 'D'],
 ['A', 1, 2, 'D'],
 ['A', 1, 8, 'D'],
 ['W', 'R', 5, 'Q'],
 ['H', 'S', 'X', 'V'],
 ['H', 'S', 'X', 7]]

相关问题