Python 如何填充嵌套列表

Python 如何填充嵌套列表,python,numpy,Python,Numpy,我有一个包含1002个时间步的嵌套列表,在每个时间步中,我观察了11个特征。我读过与填充相关的文档,但我真的不知道如何在每个列表的末尾添加零元素。我发现列表的最大长度是主列表中的第24项,现在我想在此基础上填充所有剩余元素,除非第24项元素已经成形。例如: a = [[1,2,3,4,5,6,76,7],[2,2,3,4,2,5,5,5,,7,8,9,33,677,8,8,9,9],[2,3,46,7,8,9,],[3,3,3,5],[2,2],[1,1],[2,2]] a[1] = padd

我有一个包含1002个时间步的嵌套列表,在每个时间步中,我观察了11个特征。我读过与填充相关的文档,但我真的不知道如何在每个列表的末尾添加零元素。我发现列表的最大长度是主列表中的第24项,现在我想在此基础上填充所有剩余元素,除非第24项元素已经成形。例如:

a = [[1,2,3,4,5,6,76,7],[2,2,3,4,2,5,5,5,,7,8,9,33,677,8,8,9,9],[2,3,46,7,8,9,],[3,3,3,5],[2,2],[1,1],[2,2]]

a[1] = padding(a[1],len(a[2]) with zeros at the end of the list)
我做了以下工作:

import numpy as np
def pad_or_truncate(some_list, target_len):
    return some_list[:target_len] + [0]*(target_len - len(some_list))


for i in range(len(Length)):
    pad_or_truncate(Length[i],len(Length[24]))
    
    print(len(Length[i]))


我得到了这个错误:
无法强制为Series,长度必须为11:给定375

以下代码段应使用适当数量的0填充各个列表(由具有最大元素的列表的大小决定)


解决方案1

# set the max number of 0
max_len = max([len(x) for x in a])

# add zeros to the lists
temp = [x+ [0]*max_len for x in a]

#Limit the output to the wished length
[x[0:max_len] for x in temp]
解决方案2使用
pandas

import pandas as pd
df = pd.DataFrame(a)
df.fillna(0).astype(int).values.tolist()
输出

[[1, 2, 3, 4, 5, 6, 76, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [2, 2, 3, 4, 2, 5, 5, 5, 7, 8, 9, 33, 677, 8, 8, 9, 9],
 [2, 3, 46, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [3, 3, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
 ...]

您可以使用这个简单的行,它使用
np.pad

list(map(lambda x: np.pad(x, (max(map(len, a)) - len(x), 0)).tolist(), a))
如果要在末尾填充,请使用此选项:

list(map(lambda x: np.pad(x, (0, max(map(len, a)) - len(x))).tolist(), a))

我试过了,但是它给了我每个列表相同的长度,我的意思是在上面的例子中它是有效的,但是我在代码中写它,什么也不做,因为我的主列表有1002个时间步,每次都有很多观察。但有趣的是,您的解决方案能够找到列表的最大长度。第二个解决方案不起作用,第一个解决方案能够确定列表的最大长度,但我无法将长度增加到最大值。@john22:如果您有进一步的问题,我很乐意提供帮助@Well,通过使用这一行
MAX_LEN=np.扩展_dims(MAX_LEN,axis=-1)
并用
temp=[x+[0]*MAX_LEN for x in df_train_array]
替换您的努力,上述问题得到了解决。但现在,当我检查temp或新列表元素的形状时,它们与之前的相同。我是说这之后什么都没发生。甚至,我将结果存储在一个新的列表中,但仍然没有发生任何事情。理想的输出应该是什么?@SebastienD实际上你的解决方案很好而且很有用,只是我发现这个错误
操作数不能与形状(788,11)(1163,)一起广播
但是我想我必须检查一些其他的东西您的解决方案在示例中也很好,但是在实际数据中,我得到了错误
“numpy.ndarray”对象没有属性“append”
。我试图使我的数据成为一个numpy数组,我不想再次更改它
list(map(lambda x: np.pad(x, (max(map(len, a)) - len(x), 0)).tolist(), a))
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 76, 7],
 [2, 2, 3, 4, 2, 5, 5, 5, 7, 8, 9, 33, 677, 8, 8, 9, 9],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 46, 7, 8, 9],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 5],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2]]
list(map(lambda x: np.pad(x, (0, max(map(len, a)) - len(x))).tolist(), a))