填写列表中的缺失值

时间:2017-02-09 04:08:42

标签: python

我有一个由0和1组成的列表。理想情况下,列表应该像这样0,1,0,1,0,1,0,1,0,1,0,1,0,1 .....

但是由于日志记录中的一些错误,我的列表看起来像这样:0,1,0,1,1,1,0,1,0,0,0,1,0,1 ....作为一个可以清楚地看到中间有一些错过了0和1。如何修复此列表以在缺少的元素之间添加0和1,以便获得所需的列表值。

这是我使用的代码,这对我来说是一项任务,但它不是编写脚本的最pythonic方式。那么我该如何改进这个脚本?

l1 = [0,1,0,1,1,1,0,1,0,0,0,1,0,1]
indices = []
for i in range(1,len(l1)):
    if l1[i]!=l1[i-1]:
        continue
    else:
        if l1[i]==0:
            val=1
        else:
            val=0
        l1.insert(i, val)

修改

正如评论中所述,让我解释为什么这很重要而不是产生1和0。我有TTL脉冲,即一系列HIGH(1)和LOW(0)进入,同时这些TTL脉冲中的每一个的时间记录在具有不同时钟的2台机器上。

现在,当机器I非常稳定并准确记录HIGH(1)和low(1)的每个序列时,另一台机器最终错过了几个,因此我没有时间信息。

我想要的只是将一台机器上丢失的TTL脉冲合并到另一台机器上。现在,这将允许我在两个时间上对齐时间,或者对于未接收到的脉冲,请记录

执行此操作而不是更正日志记录事项(如注释中所述)的原因是这是旧收集的数据。我们现在已经修复了日志记录问题。

3 个答案:

答案 0 :(得分:1)

为什么你会有0,1,0,1,0,1的清单?没有什么好理由我能想到的。哦,那超出了这个问题的范围,我猜......

list(itertools.islice(itertools.cycle([0,1]),expected_length))

答案 1 :(得分:1)

您可以尝试这样的事情:

from itertools import chain

l1 = [0,1,0,1,1,1,0,1,0,0,0,1,0,1]

c = max(l1.count(0), l1.count(1))
print list(chain(*zip([0]*c,[1]*c)))

输出:

[0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]

答案 2 :(得分:1)

只需乘以一个新列表。

>>> l1 = [0,1,0,1,1,1,0,1,0,0,0,1,0,1]
>>> l1
[0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1]
>>> [0,1] * (len(l1)//2)
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]

如果列表中包含奇数个元素,请添加必要的0

>>> l2 = [0,1,0,1,1,1,0,1,0,0,0,1,0,1,0]
>>> l2_ = [0,1] * (len(l1)//2)
>>> if len(l2)%2: l2_.append(0)
...
>>> l2
[0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0]
>>> l2_
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0]