如何在多个列表末尾填充零?

3

假设我有两个包含相同元素数量的整数列表(均为整数列表)。例如:

a = [[1, 7, 3, 10, 4], [1, 3, 8], ..., [2, 5, 10, 91, 54, 0]]
b = [[5, 4, 23], [1, 2, 0, 4], ..., [5, 15, 11]]

对于每个索引,我希望用尾随零填充较短的列表。上面的示例应该如下所示:
a = [[1, 7, 3, 10, 4], [1, 3, 8, 0], ..., [2, 5, 10, 91, 54, 0]]
b = [[5, 4, 23, 0, 0], [1, 2, 0, 4], ..., [51, 15, 11, 0, 0, 0]]

有没有一种优雅的方式可以在Python列表或者numpy中执行这种比较和填充操作?我知道numpy.pad可以执行填充操作,但是在列表上进行迭代和比较却让我卡住了。
4个回答

3
我相信有一种优雅的Python一行代码可以解决这种问题,但有时直接使用命令式的方法也可以完成任务。
for i in xrange(0, len(a)):
    x = len(a[i])
    y = len(b[i])
    diff = max(x, y)
    a[i].extend([0] * (diff - x))
    b[i].extend([0] * (diff - y))

print a, b

过于“优美”的解决方案也要小心,因为它们可能很难理解(我无法数清我用reduce()编写的代码需要多少次回来并努力弄清它是如何工作的)。


关于优雅的解决方案可能会变得复杂的观点很好。这种方法适用于我的应用程序。感谢您的回复。 - Troy Squillaci

2

一行?是的。优雅?不。

In [2]: from itertools import izip_longest
In [3]: A, B = map(list, zip(*[map(list, zip(*izip_longest(l1,l2, fillvalue=0)))
                               for l1,l2 in zip(a,b)]))

In [4]: A
Out[4]: [[1, 7, 3, 10, 4], [1, 3, 8, 0], [2, 5, 10, 91, 54, 0]]

In [5]: B
Out[5]: [[5, 4, 23, 0, 0], [1, 2, 0, 4], [5, 15, 11, 0, 0, 0]]

1
注意:创建2个新列表。保留旧列表。
from itertools import repeat

>>> b = [[5, 4, 23], [1, 2, 0, 4],[5, 15, 11]]
>>> a = [[1, 7, 3, 10, 4], [1, 3, 8],[2, 5, 10, 91, 54, 0]]

>>> [y+list(repeat(0, len(x)-len(y))) for x,y in zip(a,b)]
[[5, 4, 23, 0, 0], [1, 2, 0, 4], [5, 15, 11, 0, 0, 0]]

>>> [x+list(repeat(0, len(y)-len(x))) for x,y in zip(a,b)]
[[1, 7, 3, 10, 4], [1, 3, 8, 0], [2, 5, 10, 91, 54, 0]]

0
a = [[1, 7, 3, 10, 4], [1, 3, 8], [2, 5, 10, 91, 54, 0]]
b = [[5, 4, 23], [1, 2, 0, 4], [5, 15, 11]]

for idx in range(len(a)):
    size_diff = len(a[idx]) - len(b[idx])
    if size_diff < 0:
        a[idx].extend( [0] * abs(size_diff) )
    elif size_diff > 0:
        b[idx].extend( [0] * size_diff )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接