在 Python 中填写大小不均的列表

Fill in uneven sized lists in Python

我有一个 2D-List 包含不等大小的长度,像这样:

lst = [[1,2,3],[-1,2,4],[0,2],[2,-3,6]]

如果元素大小小于 3,我使用此代码插入 0:

newlist = [val.insert(1,0) for val in lst if len(val)<3]

但我只是得到了一个空的newlist,而原来的lst被插入了一个0

>>> lst = [[1,2,3],[-1,2,4],[0,2],[2,-3,6]]
>>> newlist = [val.insert(1,0) for val in lst if len(val)<3]
>>> newlist
[None]
>>> lst
[[1, 2, 3], [-1, 2, 4], [0, 0, 2], [2, -3, 6]]

我不想使用旧的 lst 列表值,因为如果修改后的值可以 return 到 newlist,我可以直接使用它转换为这样的 DataFrame:

df = pd.DataFrame([val.insert(1,0) for val in lst if len(val)<3])

那么,我该怎么做呢?并且希望代码能写成一行

您得到 None 作为 newlist 的值,因为 val.insert(1,0) returns None 作为输出。

试试这个,

lst = [[1,2,3],[-1,2,4],[0,2],[2,-3,6]]
new_list = [i + [0] if len(i) < 3 else i for i in lst]
print(new_list)

输出-

[[1, 2, 3], [-1, 2, 4], [0, 2, 0], [2, -3, 6]]

您的代码中的问题是 val.insert(1,0) 就地改变了列表,并且 returns None.

我的建议如下。它可能不完全是您期望的输出(因为它 returns 一个元组数组),但它可能会满足您的目的:

from itertools import zip_longest
list(zip(*zip_longest(*lst, fillvalue=0)))

# output: 
# [(1, 2, 3), (-1, 2, 4), (0, 2, 0), (2, -3, 6)]

解释:

[zip_longest][1]聚合每个序列的元素,如果它们的长度不均匀,则缺失值为filled-in和fillvalue。通过使用 * 运算符,每个内部列表都作为单独的参数传递给函数。

完成zip_longest,补完缺的,我又在zip了(结果被第一次zip转置了)

保持简单。您原来的方法是有效的,但只使用经典循环:

lst = [[1,2,3],[-1,2,4],[0,2],[2,-3,6]]
# if needed, keep a copy
# old_lst = lst.copy()

for l in lst:
    if len(l)<3:
        l.insert(1,0)
        
pd.DataFrame(lst)

输出:

   0  1  2
0  1  2  3
1 -1  2  4
2  0  0  2
3  2 -3  6