如何有效地修改列表的列表,使其与列表的最长列表具有相同的长度?

时间:2017-06-05 21:18:08

标签: python python-3.x

我有一个形状A == 0的二维列表,其中每个子列表都有不同的大小。为了将数据转换为Tensor,所有子列表都需要具有相同的长度,但我不想丢失转换中的子列表中的任何数据。

这意味着我需要使用填充符(A == 1)填充小于最长子列表的所有子列表,以便创建矩形数组。对于我当前的数据集,最长的子列表长度为5037。

我的转换代码如下:

(300,000, X)

但是,当-1中有300,000个序列,且for seq in new_format: for i in range(0, length-len(seq)): seq.append(-1) 通常> 4000时,此过程非常慢。如何有效加快此过程或解决问题?

1 个答案:

答案 0 :(得分:1)

单个append调用可能相当慢,因此使用list乘法一次创建整个填充值,然后立即将其连接起来,例如:

for seq in new_format:
    seq += [-1] * (length-len(seq))

seq.extend([-1] * (length-len(seq)))将是等效的(由于广义的方法调用方法,通常较慢,但考虑到实际工作的大小,可能无法察觉)。

理论上,seq.extend(itertools.repeat(-1, length-len(seq)))可以避免潜在的大临时值,但是IIRC,list.__iadd__ / list.extend的实际CPython实现强制创建一个临时的list(处理根据被扩展的list定义生成器的情况,因此它实际上不会避免临时。