我有一个由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脉冲合并到另一台机器上。现在,这将允许我在两个时间上对齐时间,或者对于未接收到的脉冲,请记录无。
执行此操作而不是更正日志记录事项(如注释中所述)的原因是这是旧收集的数据。我们现在已经修复了日志记录问题。
答案 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]