2017-10-21 19 views
0

我想提取關鍵詞之間的列表的特定部分,這就是介於和之間的所有內容,而忽略其他所有內容。從關鍵詞之間的列表中提取特定的數據塊

['badsffsg\n', 'fssdfsdgdg\n''<begin data>\n', 'data\n', '<end data>\n', 'bagsdg\n', 'fsdgdg\n', '<begin data>\n', 'data\n', 'data\n', '<end data>\n' 'gsdg\n'] 

我有麻煩搞清楚如何在列表上進行迭代。我解決了一個類似的問題,但它是在字典中固定索引處只有一個數據塊的情況下。

def extract_person(lines, start_index=0): 

    start = start_index 
    end = lines.index('<end data>\n', start_index + 1) 
    mylist = [] 

    for line in range(start + 1, end): 

這次它是一個列表,有多個數據塊,它不確定數據從哪裏開始。它只是如何迭代這個,我需要一些建議。

+0

你真的有看起來像標籤嗎?你是否奇怪地分離了一些xml/html標籤? –

回答

0

如果當前位於數據塊內,則使用變量作爲標誌。最初將標誌設置爲False

迭代列表,當遇到塊啓動時,將標誌設置爲True。 如果標誌爲True且列表項既不是開始標籤,也不是結束標籤進程列表項作爲當前數據塊的一部分。遇到塊結束時,將標誌設置爲False,並可能對封閉的數據塊進行一些最終處理。

0

使用列表的索引方法來爲您帶來好處。

some_data = ['a', 2, 'b', 'start', 1, 2, 3, 'end'] 

start = some_data.index('start')+1 
end = some_data.index('end') 

for data in some_data[start:end]: 
    print(data) 

此輸出

1 
2 
3 

你可能的情況下,添加缺少的標記

+0

這不是唯一的工作,如果有一部分的數據,如果有多個它只獲得第一位 –

+0

是的,但看到我的新答案。 – progmatico

0

確定的條件測試,當然也有寫了一個解決方案几種不同的方式。讓我們忘記索引的使用(因爲當找不到標記時它需要捕獲異常;我假設你需要一個簡單的算法)。下面的代碼實際上是一個變化,如果你仔細閱讀這兩個說明什麼邁克爾提出:

data = ['a', 2, 'b', 
     'start', 1, 2, 3, 'end', 
     'c', 'd', 
     'start', 2, 2, 5, 'end', 
     10, 
     'start', 5, 6 ,7, 'end'] 

blocks = [] # to keep valid data blocks 
pos = 0 
end = len(data) 
while pos < end: 
    if data[pos] == 'start': 
     block = [] 
     pos += 1 
     while pos < end and data[pos] != 'end': # condition order important! 
      block.append(data[pos]) 
      pos += 1 
     blocks.append(block) 
    else: 
     pos += 1 

print(blocks) 

說明:可變blocks

我們將收集有效數據塊。

我們從頭開始到end(而不是更多)使用pos(位置)來保持當前的指數位置。找到'start'表示創建一個空的新block來存儲下一個項目,直到找到'end'標記。

我們附加塊數據,但要注意列表不會過早結束,直到找到'end'標記。條件順序非常重要,因爲否則我們可能會嘗試訪問data並顯示無效(太大)的索引。如果左邊的第一個條件已經是False,那麼and運算符右邊的條件不被評估,所以在這種情況下沒有錯誤。

我們繼續,直到列表結束。

如果有一個'start'標記沒有和'end'標記,最後的空白塊留在結果blocks列表中。

相關問題