簡體   English   中英

python 按關鍵字拆分列表

[英]splitting list in python by keyword

我有一個如下列表:

lst = ['a', 'a', 'a', 'start', 'b', 'end', 'a', 'a','a','start','b','b','b','end','a','a','a','a','start','b','b','end']

我想要的結果是將列表拆分為如下子列表:

[['a', 'a', 'a'], ['start', 'b', 'end'], ['a', 'a','a'],['start','b','b','b','end'],['a','a','a','a'],['start','b','b','end']]

所以 start 和 end 是關鍵字,無論如何你可以使用.split() 使用特定的關鍵字/如果它匹配?

到目前為止,我已經制作了一個 function ,它找到了“開始”的索引,即starting_ind = [3, 9, 18]ending_ind = [5, 13, 21]但是如果我這樣做

temp=[]
for i in range(len(starting_ind)):
       x = lst[starting_ind[i]: ending_ind[i]]
       temp += x
print(temp)     

結果不正確。

此解決方案不需要您事先計算索引:

lst = ['a', 'a', 'a', 'start', 'b', 'end', 'a', 'a', 'a', 'start', 'b', 'b',
       'b', 'end', 'a', 'a', 'a', 'a', 'start', 'b', 'b', 'end', 'a', 'a', 'a']
result = []
sublist = []

for el in range(len(lst)):
  if lst[el] == 'start':
    result.append(sublist.copy())
    sublist.clear()
    sublist.append(lst[el])
  else:
    sublist.append(lst[el])
    if lst[el] == 'end':
      result.append(sublist.copy())
      sublist.clear()
    if el == len(lst) - 1:
      result.append(sublist)
print(result)

結果是:

[['a', 'a', 'a'], ['start', 'b', 'end'], ['a', 'a', 'a'], ['start', 'b', 'b', 'b', 'end'], ['a', 'a', 'a', 'a'], ['start', 'b', 'b', 'end'], ['a', 'a', 'a']]

這是一種使用正則表達式提取模式的可能方法,請檢查它是否可以接受:

import re

lst = ['a','a','a', 'start','b','end', 'a','a','a', 'start','b','b','b','end', 'a','a','a','a', 'start','b','b','end']
result = []
for e in re.findall('a_[a_]+|start[_b]+_end', '_'.join(lst)):
    result.append(e.strip('_').split('_'))
print(result)

Output 根據需要:

[['a', 'a', 'a'],
 ['start', 'b', 'end'],
 ['a', 'a', 'a'],
 ['start', 'b', 'b', 'b', 'end'],
 ['a', 'a', 'a', 'a'],
 ['start', 'b', 'b', 'end']]

更好的方法是:

result = []
for e in re.split(r'(start[_b]+_end)', '_'.join(lst)):
    result.append(e.strip('_').split('_'))
print([x for x in result if x != ['']])

同 output

你可以這樣寫:

   lst = ['a', 'a', 'a', 'start', 'b', 'end',
          'a', 'a','a','start','b','b','b','end','a','a','a','a','start','b','b','end']
   temp=[]
   ind = [0, 3, 6, 9, 14, 18, 22]
   for i in range(len(ind)-1):
          x = lst[ind[i]: ind[i+1]]
          temp.append(x)
   print(temp)

你會得到:

[['a', 'a', 'a'], ['start', 'b', 'end'], ['a', 'a', 'a'], ['start', 'b', 'b', 'b', 'end'], ['a', 'a', 'a', 'a'], ['start', 'b', 'b', 'end']]

如果您可以確定您的關鍵字將始終成對出現並且以正確的順序出現(即,在列表中的某個位置,永遠不會有一個沒有'end''start' ),這應該有效:

l = ['a', 'a', 'a', 'start', 'b', 'end', 'a', 'a','a','start','b','b','b','end','a','a','a','a','start','b','b','end']

def get_sublist(l):
    try: 
        return l[:l.index('end') + 1] if l.index('start') == 0 else l[:l.index('start')]
    except ValueError:
        return l

result = []

while l:
    sublist = get_sublist(l)
    result.append(sublist)
    l = l[len(sublist):]

print(result)

給出以下結果:

[['a', 'a', 'a'],
 ['start', 'b', 'end'],
 ['a', 'a', 'a'],
 ['start', 'b', 'b', 'b', 'end'],
 ['a', 'a', 'a', 'a'],
 ['start', 'b', 'b', 'end']]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM