我有下面的列表a
和None
值,我想对它们进行“填充”。
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
2条答案
按热度按时间bqjvbblv1#
你可以用列表来理解这个问题,但我不确定它是否已经为你的解决方案增加了很多。
我不确定这是否是设计的,但在你的例子中,一个数字永远不会向下移动到下一行。如果你想确保只携带字母,可以通过跟踪每个位置上最后看到的字母来添加。假设
a
的第一行总是字母,那么;icnyk63a2#
首先,考虑将“填充”到一行的过程。我们有两行作为输入:上面的行和下面的行;我们想要consider elements from the two lists pairwise。对于每一对,我们的输出由简单的逻辑确定-如果第二个值
is None
,则使用第一个值,否则使用第二个数值:然后我们在成对迭代中apply to each pair:
接下来,我们需要从原始列表中删除consider overlapping pairs行。每次,我们将“当前”行的replace the contents与
fill_down_row
结果进行比较,将它们分配给整个列表。通过这种方式,我们可以优雅地就地更新行列表,这允许更改传播到下一次迭代。因此:让我们测试一下: