如何将每个第n项保留在列表中并使其余的零

Ric*_*all 1 python list

我试图建模并适应长时间序列中的噪声数据,我想看看如果我删除了大量的数据,我的拟合会发生什么.

我有很长的时间序列数据,我只对每个第n项感兴趣.但是,我仍然希望随着时间的推移绘制此列表,但删除了所有其他不需要的元素.

例如,对于n = 4,列表

a = [1,2,3,4,5,6,7,8,9,10...]
Run Code Online (Sandbox Code Playgroud)

应该成为

a_new = [1,0,0,0,5,0,0,0,9,0...]
Run Code Online (Sandbox Code Playgroud)

我不介意第n个项目的位置是否在序列的开头或结尾,我的系列实际上是任意的,并且很长以至于我删除的内容都无关紧要.例如'a_new'也可以是:

a_new = [0,0,0,4,0,0,0,8,0,0...]
Run Code Online (Sandbox Code Playgroud)

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

编辑1:

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

a_new = [1,,,,5,,,,9...] 
Run Code Online (Sandbox Code Playgroud)

编辑2:

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

谢谢!

Mos*_*oye 5

使用带有三元条件列表推导,它使用数字上mod的每个元素n:

>>> 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]
Run Code Online (Sandbox Code Playgroud)

如果数据没有递增地进行,这很可能是使用,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]
Run Code Online (Sandbox Code Playgroud)

使用时也可以轻松更改起点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]
Run Code Online (Sandbox Code Playgroud)

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

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