简体   繁体   English

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

[英]How to pad multiple lists with trailing zeros?

Suppose I have two lists containing the same number of elements which are lists of integers. 假设我有两个包含相同数量元素的列表,这些元素是整数列表。 For instance: 例如:

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 each index, I want to pad the shorter list with trailing zeros. 对于每个索引,我想用尾随零填充较短的列表。 The example above should look like: 上面的示例应如下所示:

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

Is there an elegant way to perform this comparison and padding build into Python lists or perhaps numpy? 是否有一种优雅的方式来执行此比较和填充构建到Python列表或可能numpy? I am aware that numpy.pad can perform the padding, but its the iteration and comparison over the lists that has got me stuck. 我知道numpy.pad可以执行填充,但它的迭代和比较已经让我卡住的列表。

I'm sure there's an elegant Python one-liner for this sort of thing, but sometimes a straightforward imperative solution will get the job done: 我确信这种方法有一个优雅的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

Be careful with "elegant" solutions too, because they can be very difficult to comprehend (I can't count the number of times I've come back to a piece of code I wrote using reduce() and had to struggle to figure out how it worked). 小心“优雅”的解决方案也是如此,因为它们很难理解(我无法计算我回到使用reduce()编写的一段代码的次数,并且不得不弄清楚它是如何工作的)。

One line? 一条线? Yes. 是。 Elegant? 优雅? No. 没有。

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

Note: Creates 2 new lists. 注意:创建2个新列表。 Preserves the old lists. 保留旧列表。

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

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 )

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM