цикл назад или вперед в списке питонов, чтобы найти совпадение - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть список python, в котором я буду искать и находить один термин.Как только я нахожу его, мне нужно вернуться назад в списке и найти первое вхождение с помощью =, а затем пойти вперед и найти первое вхождение с помощью ;.

Я пытался использовать цикл while, но это не такработа.

extract = [1,2,"3=","fd","dfdf","keyword","ssd","sdsd",";","dds"]

indices = [i for i,s in enumerate(extract) if 'keyword' in s] 


for ind in indices:
    ind_while_for = ind
    ind_while_back = ind
    if ('=' in extract[ind]) & (';' in extract[ind]):
        print(extract[ind])   
    if (';' in extract[ind]) & ('=' not in extract[ind]):
        while '=' in extract[ind_while_back-1]:
            ind_while_back -= 1    
        print(' '.join(extract[ind_while_back:ind]))

требуется результат: 3= fd dfdf keyword ssd sdsd ;

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Попробуйте функцию ниже:

extract = ['1','2','3=','fd','dfdf','keyword','ssd','sdsd',';','dds']

def get_output_list(extract, key): 
    equals_indices = [i for i,j in enumerate(extract) if '=' in j]
    semicolon_indices = [i for i,j in enumerate(extract) if ';' in j]
    if key not in extract or len(equals_indices) == 0 or len(semicolon_indices) == 0: 
        return 'no match found1'
    keyword_index = extract.index(key) 
    if any([keyword_index<i for i in semicolon_indices]) and any([keyword_index>i for i in equals_indices]) : 
        required_equal_index = keyword_index - equals_indices[0]
        required_semicolon_index = semicolon_indices[0] - keyword_index
        for i in equals_indices: 
            if (i < keyword_index) and required_equal_index > i: 
                required_equal_index = i
        for i in semicolon_indices: 
            if (i > keyword_index) and (required_semicolon_index < i) :
                required_semicolon_index = i
        return extract[required_equal_index:required_semicolon_index+1]
    else : 
        return 'no match found'
0 голосов
/ 25 февраля 2019

Вы можете использовать:

l = [1, 2, "3=", "fd", "dfdf", "keyword", "ssd", "sdsd", ";", "dds"]

s = "keyword"

def take(last, iterable):
    l = []
    for x in iterable:
        l.append(x)
        if last in x:
            break
    return l

# get all elements on the right of s
right = take(';', l[l.index(s) + 1:])

# get all elements on the left of s using a reversed sublist
left = take('=', l[l.index(s)::-1])

# reverse the left list back and join it to the right list
subl = left[::-1] + right

print(subl)
['3=', 'fd', 'dfdf', 'keyword', 'ssd', 'sdsd', ';']
0 голосов
/ 25 февраля 2019

Найти позицию ключевого слова:

kw = extract.index("keyword")

Найти элемент с наибольшим индексом, который содержит "=" в подсписке исходного списка перед позицией ключевого слова:

eq = max(i for i,w in enumerate(extract[:kw]) 
         if isinstance(w,str) and "=" in w)

Найти элемент с наименьшим индексом, который содержит ";" в подсписке от предыдущего элемента до конца:

semi = min(i for i,w in enumerate(extract[eq:], eq) 
           if isinstance(w,str) and ';' in w)

Извлечь подсписок между двумя крайностями:

extract[eq:semi+1]
#['3=', 'fd', 'dfdf', 'keyword', 'ssd', 'sdsd', ';']
...