如果缺少,Python将元素添加到列表中的列表
Posted
技术标签:
【中文标题】如果缺少,Python将元素添加到列表中的列表【英文标题】:Python Add Elements to Lists within List if Missing 【发布时间】:2017-03-31 05:12:14 【问题描述】:给定以下列表:
a = [[2,3],[1,2,3],[1]]
我需要 a 中的每个列表都具有相同数量的元素。 首先,我需要获取 a 中任何列表的最长长度。 然后,我需要确保所有列表至少有那么长。 如果不是,我想在末尾添加一个零 (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)
【问题讨论】:
你能发布你的尝试吗? 似乎相关:Convert Python sequence to NumPy array, filling missing values
.
【参考方案1】:
首先,计算元素的最大长度:
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
【讨论】:
maxlen=len(max(a,key=len))
看起来有点奇怪。有任何理由这样做超过maxlen=max(len(sublist) for sublist in a)
不,这只是我能想到的最复杂的单线:)。我知道我必须避免filter
、map
和很多复杂的结构,大多数情况下最好用 listcomps/gencomps 代替,但我继续这样做......用你的编辑替代品。
我知道你的意思。几年来我只做函数式编程,有时我觉得我回来了,想告诉大家这一切都只是墙上的影子。
非常有哲理:) 前几天我在那些功能性工件上失去了一个很好的答案。而在 python 3 中,当你需要一个列表时,你必须显式地转换它,使它变得更加复杂。就这样决定了:我要停下来了 :) 谢谢你把我带出洞穴。
使用itertools.zip_longest
,您无需自己计算最大长度。【参考方案2】:
for i in a:
while len(i) < 3:
i.append(0)
【讨论】:
慢...避免for循环,最重要的是追加:) @JohnSmith 谢谢你指出这一点,我实际上并不知道特别是关于附加的,很高兴知道:)【参考方案3】:怎么样
pd.DataFrame(a).fillna(0)
得到你想要的东西
pd.Series(pd.DataFrame(a).fillna(0).astype(int).values.tolist()).to_frame('column')
这也和this question有关
您可以在哪里获得更好的性能
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()))
时机
【讨论】:
将是我的 goto 解决方案以上是关于如果缺少,Python将元素添加到列表中的列表的主要内容,如果未能解决你的问题,请参考以下文章