Python вложенный обратный цикл - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь создать обратный цикл, вложенный в цикл for, как только цикл for удовлетворяет определенному критерию, затем включается обратный цикл, чтобы получить требуемую информацию, которую я ищу, исходя из второй, непротиворечивой, критерий, который я знаю. Обычно можно выполнить цикл for для поиска необходимой информации; тем не менее, я знаю только критерии и не знаю необходимой информации, кроме той, которая указана перед критериями и может быть в одном из трех различных форматов. Я использую Python 3.6.

РЕДАКТИРОВАТЬ: Похоже, что меня отталкивает, это другой формат «то, что я ищу». Чтобы упростить его, давайте перейдем к одному конкретному формату, информацию, которую я хочу, можно сгруппировать с информацией, которую я не хочу.

searchList = [['apple'], ['a criterion for'], 
['what Im looking for'], ['a criterion for what Im looking for   not what Im looking for'], 
['fish'], ['coffee'], ['oil']]
saveInformation = []
for n in range(len(searchList)):
    if 'coffee' in searchList[n]:
        for x in range(n, 0, -1):
            if 'a criterion for' in searchList[x]:
                 #this part just takes out the stuff I don't want
                 saveInformation.append(searchList[x])
                 break
            else: 
                 # the reason for x+1 here is that if the above if statement is not met, 
                 #then the information I am looking for is in the next row. 
                 #For example indices 1 and 2 would cause this statement to execute if index 
                 #3 was not there
                 saveInformation.append(searchList[x+1])
                 break

Ожидаемый результат

saveInforation = ['what Im looking for']

Вместо этого я получаю вывод

saveInforation = ['oil']

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Вы можете использовать небольшой список для достижения аналогичного эффекта:

search = ['apple', 'im looking for', 'coffee', 'fish']
results = [item for item in search
           if 'coffee' in search
           and item == 'im looking for']

Это выполнит необходимые вам проверки, только добавив нужный элемент в новый список, и даже тогда, только если ваш элемент критерия присутствует.

Вы можете даже добавить больше элементов для поиска, например так: '

itemsWanted = ['im looking for', 'fish']

Тогда в вашем списке понимания замените if item == 'im looking for' на if item in itemsWanted

В качестве примечания вы можете уменьшить количество проверок, выполнив оператор if в самом начале:

if 'coffee' in search: # criterion matched
    results = [i for i in search
               if i in itemsWanted]
0 голосов
/ 27 августа 2018

Я думаю, что лучше не вкладывать циклы for, а разбивать проблему на отдельные этапы. Возможно, даже лучше сделать отдельную функцию для каждого шага.

Ваши требования мне не совсем понятны, но я думаю, что это то, что вам нужно:

def search_forward(searchList, key):
    for i, element in enumerate(searchList):
        if key in element:
            return i
    raise ValueError

def search_backward(searchList, key, start):
    for i in range(start - 1, -1, -1):
        if key in searchList[i]:
            return i
    raise ValueError

searchList = [['apple'], ['a criterion for'], 
['what Im looking for'], ['a criterion for what Im looking for   not what Im looking for'], 
['fish'], ['coffee'], ['oil']]

coffee_index = search_forward(searchList, 'coffee')
a_criterion_for_index = search_backward(searchList, 'a criterion for', coffee_index - 1)
saveInformation = searchList[a_criterion_for_index + 1]
print(saveInformation)
0 голосов
/ 27 августа 2018

Я ответил на аналогичный вопрос вчера, поэтому дам вам код и объясню, как вы могли бы его реализовать.

Сначала вам нужен список, который у вас уже есть, отлично! Давайте назовем это wordlist. Теперь вам нужен код, чтобы найти его

for numbers in range(len(wordlist)):
    if wordlist[numbers][0] == 'the string im looking for':
        print(wordlist[numbers])
...