Python向列表中添加元素,如果缺失,则在列表中添加列表。

5

考虑下面的列表嵌套:

a = [[2,3],[1,2,3],[1]]

我希望在一个列表中,每个子列表的元素数量相同。 首先,我需要获取所有子列表中最长的长度。 然后,我需要确保所有子列表的长度都至少达到这个长度。 如果不满足条件,我就要在子列表末尾添加零(0)直到满足为止。 最终想要的结果是:

b = [[2,3,0],[1,2,3],[1,0,0]]

感谢您的提前帮助! 附注:我还需要将此应用于像这样的Pandas数据框:
import pandas as pd
b = [[2,3,0],[1,2,3],[1,0,0]]
f=pd.DataFrame({'column':b})

你能否发布你的尝试呢? - Christian Dean
3个回答

5

首先,计算您的元素的最大长度:

maxlen=len(max(a,key=len))  # max element using sublist len criterion

或者像Patrick建议的那样,使用生成器推导式来处理子列表长度,可能会稍微快一些:

maxlen=max(len(sublist) for sublist in a)  # max of all sublist lengths

然后创建一个新的列表并进行0填充:

b = [sl+[0]*(maxlen-len(sl)) for sl in a]  # list comp for padding

a = [[2,3],[1,2,3],[1]] 的结果为:

[[2, 3, 0], [1, 2, 3], [1, 0, 0]]

注意:可以在一行中完成,但由于maxlen的重新计算,性能可能不佳。一行代码并不总是最好的解决方案。
b = [sl+[0]*(len(max(a,key=len))-len(sl)) for sl in a]  # not very performant

1
maxlen=len(max(a,key=len)) looks a little odd. Any reason to do it this way over maxlen=max(len(sublist) for sublist in a) - Patrick Haugh
不,那只是我能想到的最复杂的一行代码 :). 我知道我必须避免使用filtermap和很多复杂的结构,这些最好用列表推导式/生成器表达式来替代,但我还是会继续这样做... 请使用您的替代方案进行编辑。 - Jean-François Fabre
我知道你的意思。我只做了几年的函数式编程,有时候感觉自己回来了,试图告诉每个人这只是墙上的影子。 - Patrick Haugh
非常有哲理 :) 前几天我因为那些函数式工件失去了一个好答案。在Python 3中,当你需要从这些工件中获取一个列表时,你必须显式地进行转换,使它变得更加复杂。决定了:我要停下来了 :) 感谢你让我走出洞穴。 - Jean-François Fabre
使用 itertools.zip_longest,您无需自己计算最大长度。 - hpaulj
是的,但之后你必须转置数据。 - Jean-François Fabre

5

How about

pd.DataFrame(a).fillna(0)

在此输入图像描述


获得您所需的精确内容。

pd.Series(pd.DataFrame(a).fillna(0).astype(int).values.tolist()).to_frame('column')

在这里输入图片描述


这也与这个问题有关

使用以下方法可以获得更好的性能:

def box(v):
    lens = np.array([len(item) for item in v])
    mask = lens[:,None] > np.arange(lens.max())
    out = np.full(mask.shape, 0, dtype=int)
    out[mask] = np.concatenate(v)
    return out

pd.DataFrame(dict(columns=box(a).tolist()))

这里输入图片描述


时序
这里输入图片描述


将来说到解决方案,这将是我的首选。 - John Smith

0
for i in a: 
    while len(i) < 3:
        i.append(0)

1
慢...避免使用for循环,最重要的是避免使用append()函数 :) - John Smith
2
@JohnSmith 谢谢你指出这一点,我其实不知道,特别是关于追加的部分,这很有用 :) - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接