Python 如何用尾随零填充多个列表?

Python 如何用尾随零填充多个列表?,python,arrays,numpy,padding,Python,Arrays,Numpy,Padding,假设我有两个包含相同数量元素的列表,它们是整数列表。例如: 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,

假设我有两个包含相同数量元素的列表,它们是整数列表。例如:

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中?我知道它可以执行填充,但让我陷入困境的是对列表的迭代和比较。

我确信对于这类事情有一个优雅的Python one liner,但有时一个简单的命令式解决方案可以完成这项工作:

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()
编写的一段代码的返回次数,并且必须努力找出它是如何工作的)。

注意:创建两个新列表。保留旧列表

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]]
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]]
对于范围内的idx(len(a)):
大小_diff=len(a[idx])-len(b[idx])
如果尺寸_差异<0:
a[idx]。扩展([0]*abs(大小差异))
elif大小_差异>0:
b[idx]。扩展([0]*size_diff)

一行?对优雅的没有

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

关于优雅的解决方案是如何错综复杂的,这是一个很好的观点。这种方法适用于我的应用程序。谢谢你的回复。
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]]