2015-08-13 3 views
0

обучения закодировать с Python 3. Я смущен, почему моя else заявление продолжает выполнение с кодом ниже:Если-то еще внутри некоторое время заявления

def countSubStringMatch(target, key): 
    index = 0 
    instance_list = [] 

    while index <= len(target): 
     match = target.find(key,index) 
     if match > -1: 
      instance_list.append(match) 
      index += 1 
     elif match == -1: 
      return None 

    return sorted(set((instance_list))) 

target1 = 'mjzzmjzzmjzz' 
key1 = 'zz' 

print(countSubStringMatch(target1, key1)) 

Суть этого кода заключается в список индексов, при которых ключ запускается. У меня был код, работающий нормально, когда есть реальные экземпляры ключа в пределах цели, но я пытаюсь отредактировать его, чтобы вернуть None, когда нет экземпляров. Это был мой код до редактирования:

def countSubStringMatch(target, key): 
    index = 0 
    instance_list = [] 

    while index <= len(target): 
     match = target.find(key,index) 
     if match > -1: 
      instance_list.append(match) 
     index += 1 

    return sorted(set((instance_list))) 

target1 = 'mjzzmjzzmjzz' 
key1 = 'zz' 

print(countSubStringMatch(target1, key1)) 
+2

У вас нет предложения 'else'. –

+0

Я получаю тот же результат с предложением else. – MJ49

+0

Если вы просто вводите строку «break», все работает нормально. Но я явно хочу вернуть None. – MJ49

ответ

2

Вы в конце концов, всегда получаете -1, как вы ненастная индекс. Так что да, ваш elif будет соответствовать и вы в конечном итоге возвращаются None:

>>> target1 = 'mjzzmjzzmjzz' 
>>> key1 = 'zz' 
>>> target1.find(key1, 0) 
2 
>>> target1.find(key1, 3) 
6 
>>> target1.find(key1, 7) 
10 
>>> target1.find(key1, 11) 
-1 

Так что, когда index = 11, target.find() возвращает -1 для ввода образца. Поскольку len(target) равно 12, это все еще в вашей петле.

Только возврат None, когда instance_list пуст. Также добавьте свой индекс к шагу за в найденный индекс, нет смысла увеличивать индекс на 1 каждый раз; Таким образом, вы избегаете всех индексов дублированных и устраняет необходимость в использовании набора:

def countSubStringMatch(target, key): 
    index = 0 
    instance_list = [] 

    while index <= len(target) - len(key): 
     match = target.find(key, index) 
     if match == -1: 
      break 
     instance_list.append(match) 
     index = match + 1 

    return instance_list or None 

Там нет смысла в поиске из индекса, равного длине мишени минус длиной ключа; вы не найдете ключ в индексе 11.

Это возвращает None, если совпадений не найдено, а не списка. Вы можете пересмотреть это; тестирование для пустого списка так же просто и делает ваш API совместимым (всегда возвращающий список, который может быть пустым):

>>> target1 = 'mjzzmjzzmjzz' 
>>> key1 = 'zz' 
>>> countSubStringMatch(target1, key1) 
[2, 6, 10] 
>>> countSubStringMatch(target1, 'foo') is None 
True 
+0

Я не уверен, что вы хотели сказать там ; Я могу прокомментировать удаленные сообщения. –

+0

Хороший способ привлечь участие - задавать вопросы, если вы гильотинируете всех, кто пытается участвовать, вы будете участвовать в создании этого города-призрака с вами, как шериф. – Incognos

+0

Не следует ли комментировать, когда я голосоваю по вашим ответам с этого момента? Я даю отзывы всякий раз, когда я это делаю, и всегда рад отступить, когда проблема решена. Что касается вашего обвинения, я сделал это с вами раньше, я не могу найти никакой ссылки на нас, соревнуясь по вопросу раньше, и я также не прокомментировал какие-либо ваши сообщения раньше. Я искал [предыдущие все еще восстановленные взаимодействия] (http://data.stackexchange.com/stackoverflow/query/25355/have-we-met), все ваши удаленные ответы и мои удаленные комментарии. –

Смежные вопросы