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

时间:2016-09-13 09:52:41

标签: python list

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

我有很长的时间序列数据,我只对每个第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:

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

谢谢!

3 个答案:

答案 0 :(得分:5)

列表理解ternary conditional一起使用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]

如果数据没有以递增的方式继续进行(最有可能),请使用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]

答案 1 :(得分:0)

[0 if i%4 else num for i, num in enumerate(a)]

答案 2 :(得分:0)

这是一个在给定某个步骤K过滤函数的工作示例:

6642

输出:

app.get('/api/:name', function(req, res){
    var name = req.params.name;

    var query = [{$match: {'name': name}}, {$unwind: { path: "$dates", includeArrayIndex: "idx" } }, { $project: { _id: 0, dates: 1, numbers: { $arrayElemAt: ["$numbers", "$idx"] }, goals: { $arrayElemAt: ["$goals", "$idx"] }, durations: { $arrayElemAt: ["$durations", "$idx"]}}}];

    db.collection('coll').aggregate(query).toArray(function(err, docs) {
        if (err) {
            assert.equal(null);
        }
        else {
            console.log(docs);
            res.json(docs);
        } 
    });
})