2017-02-09 87 views
0

我有一個由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非常穩定,並且準確地記錄了高(1)和低(1)的每個序列,但其他機器最終錯過了其中的幾個,因此我沒有這些時間信息。

我只想將一臺機器上缺少的TTL脈衝合併到另一臺機器上。現在這將允許我對它們進行時間調整,或者對於沒有收到的脈衝記錄

做這件事的原因,而不是糾正記錄的事情(如評論中所述)是這是一箇舊的收集數據。我們現在已經修復了日誌記錄問題。

+5

好奇,爲什麼人會打擾固定的0和1組成的名單時,你可以很容易地生成任意長度此列表。 – odin

+3

我投票,你嘗試修復日誌記錄,而不是錯誤的輸出。 – synchronizer

+1

您提到該列表**理想**看起來** 0,1,0,1 **,並不總是。所以不能保證它會是** 0,1,0,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] 
1

你爲什麼要列出0,1,0,1,0,1?我想不出有什麼好的理由。哦,遠遠超出了這個問題,我猜這就是範圍...

list(itertools.islice(itertools.cycle([0,1]),expected_length)) 
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] 
+0

時刻:D。只要「如果還有」一次,看起來會更乾淨。 – MYGz