Skip to main content
 首页 » 编程设计

python之如何保留列表中的第 n 个项目并使其余项目为零

2025年05月04日24xing901022

我正在尝试对长时间序列中的嘈杂数据进行建模和拟合,我想看看如果删除大量数据,我的拟合会发生什么。

我有一个很长的时间序列数据,我只对第 n 个项目感兴趣。然而,我仍然想随着时间的推移绘制这个列表,但删除所有其他不需要的元素。

例如,对于n=4,列表

a = [1,2,3,4,5,6,7,8,9,10...] 

应该变成

a_new = [1,0,0,0,5,0,0,0,9,0...] 

我不介意第 n 个项目的位置是在序列的开始还是结束,我的序列实际上是任意的,而且很长以至于我删除什么都无关紧要。例如 'a_new' 也可以是:

a_new = [0,0,0,4,0,0,0,8,0,0...] 

理想情况下,解决方案不依赖于列表的长度,但我可以将该长度作为变量。

编辑 1:

我实际上想要空元素,而不是零,(如果可能的话?)所以:

a_new = [1,,,,5,,,,9...]  

编辑 2:

我也需要从我的时间序列中删除相应的元素,以便在绘制所有内容时,每个数据元素都具有与时间序列元素相同的索引。

谢谢!

请您参考如下方法:

使用列表理解 和 ternary conditional它采用数字 n 上每个元素的 mod:

>>> a = [1,2,3,4,5,6,7,8,9,10] 
>>> n = 4 
>>> [i if i % n == 0 else 0 for i in a] 
[0, 0, 0, 4, 0, 0, 0, 8, 0, 0] 

如果数据不是递增的(这很可能是这样),请使用 enumerate,这样 mod 就会在索引上而不是在元素上:

>>> [v if i % n == 0 else 0 for i, v in enumerate(a)] 
[1, 0, 0, 0, 5, 0, 0, 0, 9, 0] 

使用 enumerate 时也可以轻松更改起点:

>>> [v if i % n == 0 else 0 for i, v in enumerate(a, 1)] # start indexing from 1 
[0, 0, 0, 4, 0, 0, 0, 8, 0, 0] 

如果您打算删除您不需要的数据而不是替换它们,那么过滤器使用if(而不是三元运算符)列表理解可以处理这个:

>>> [v for i, v in enumerate(a, 1) if i % n == 0] 
[4, 8]