2017-10-22 92 views
1

之間的列表中提取多個數據片段的該代碼提取(1,2,3)如果存在多個的關鍵詞「開始」和「結束」在關鍵字

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) 

但會發生什麼之間的數據數據塊列表中的像豆腐渣線中:

['a', 2, 'b', 'start', 1, 2, 3, 'end', 'a', 1, x, 'start', 3, 7, 8, 'end', 'start', 3, 7, 8, 'end'] 

你怎樣才能提取他們所有而不只是第一塊數據

+0

嘗試在循環中迭代列表。 –

+0

[這篇文章](https://stackoverflow.com/questions/46819586/concatenate-list-elements-that-fall-between-list-elements-of-certain-value/46820133#46820133)從其他日子可能會給你有些提示。 – atru

回答

0

我上面的評論者同意的,這裏有一個很簡單的例子的可以做些什麼。

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

index = 0 
retrieved_data = [] 
while index < len(some_data): 
    if some_data[index] == 'start': 
     collecting = True 
     values = [] 
     while collecting: 
      index += 1 
      if some_data[index] == 'end': 
       collecting = False 
      else: 
       values.append(some_data[index]) 
     retrieved_data.append(values) 
    index += 1 
+0

謝謝。 Woul; d很容易編輯它,因此每個[數據片段都被添加到它自己的元組或單獨列表中 –

+0

您的意思是說,在'開始'和'結束'信號詞之間的每個區間有不同的元組/列表嗎?我可以編輯它以反映這種變化。 –

+0

是的,這就是我的意思 –

0

你可以做這樣的事情來獲得項目的索引號並使用它們要如何:

def get_indexes(items, keyword): 
    indexes = [] 
    if keyword in items: 
     for i, data in enumerate(items): 
      if data == keyword: 
       indexes.append(i) 
    else: 
     raise AttributeError("invalid keyword given") 
    return indexes 

這將返回所有與指定關鍵字索引的list

some_data = ['a', 2, 'b', 'start', 1, 2, 3, 'end', 'a', 1, 'x', 'start', 3, 7, 8, 'end', 'start', 3, 7, 8, 'end'] 
get_indexes(some_data, "start") 
# [3, 11, 16] 
get_indexes(some_data, "end") 
# [7, 15, 20] 
-1

執行此操作的「pythonic」方法是簡單迭代而不處理索引。下面是一個如何完成的例子:

def get_intervals(data): 
    collecting = False 
    intervals = [] 

    for item in data: 
     if item == 'start': 
      interval = [] 
      collecting = True 
      continue 
     if item == 'end': 
      intervals.append(interval) 
      collecting = False 
      continue 
     if collecting: 
      interval.append(item) 

    return intervals