2017-06-24 164 views
1

假設我有如下所示的列表。你怎麼能遍歷列表並替換零之間的零長度可以改變的零之間的界限?將列表中的列表替換爲列表中的列表

輸入:

mylist = [0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0] 

輸出:

mylist = [0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0] 
+3

爲什麼中間還有零點? –

+0

@WillemVanOnsem您似乎已經回答了您自己的問題。介意解釋一下,因爲我仍然不完全明白? –

+0

@ChristianDean:它就像圖形中的*偶奇*規則:有一個「突發」的,一連串的「零」等等。所以我們填入前兩個,第三個和第四個1,等等。 –

回答

3

我認爲你可以分兩個階段執行此操作:

  1. 第一,我們獲得其中的有指示指標;和
  2. 我們一次拿兩個,並用這些全部填充。

像:

# obtain an iterable of the indices of the ones 
ones = iter([i for i,x in enumerate(mylist) if x == 1]) 

# for every pair of indices 
for i0,i1 in zip(ones,ones): 
    # iterate over the range 
    for j in range(i0+1,i1): 
     # and assign 1 to these indices 
     mylist[j] = 1 

這產生:

>>> mylist 
[0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0] 
0

守旗,無論你是 「內部」 1-1塊(和u需要更新0到1)或不。

這是假設,即單(「最後」)1將產生那些直到列表的末尾:

inside = False 
for x in range(len(data)): 
    if data[x]: 
    inside = not inside 
    elif inside: 
    data[x] = 1 
[ 0, 1, 0, 1, 0 ] -> [ 0, 1, 1, 1, 0 ] 
[ 0, 1, 0, 0, 0 ] -> [ 0, 1, 1, 1, 1 ] 

如果不是你想要的,最後1應該被忽略:

start_block = None 
for x in range(len(data)): 
    if data[x]: 
    if start_block is not None: 
     for y in range(start_block + 1, x): 
     data[y] = 1 
     start_block 
    else: 
     start_block = x 
[ 0, 1, 0, 1, 0 ] -> [ 0, 1, 1, 1, 0 ] 
[ 0, 1, 0, 0, 0 ] -> [ 0, 1, 0, 0, 0 ]