2015-11-17 3 views
-1

Я пытаюсь написать рекурсивную функцию, которая проверяет наличие определенного символа в списке (список может содержать подписи).Проверьте, существует ли символ в списке

До сих пор я придумал это, но он, похоже, не работает. Что я делаю неправильно?

def exists(str, seq): 
     if not seq: 
      return 0 
     elif isinstance(seq[0], list): 
      return exists(seq[0]) + exists(seq[1:]) 
     elif str == seq[0]: 
      return True 
     else: 
      return exists(seq[1:]) 

Если я пытаюсь

print(exists("c", [a,[b,c],d])) 

Я получаю имя «а» не определен

+0

Итак, вы получаете сообщение об ошибке или ...? – Kevin

+0

он не должен даже запускаться, ваш 'exists' требует 2 аргумента, и вы передаете только один в recurssion (где находится' str'?) – lejlot

+0

Подсказка: знаете ли вы, что делают кавычки вокруг 'c' в' exists (" c ", [a, [b, c], d])'? – GingerPlusPlus

ответ

1
def exists(str, seq): 

Вы не должны использовать встроенный тип str как имя переменной.

 return 0 

Для бинарных функций вы должны вернуться False, а не 0.

 return exists(seq[0]) + exists(seq[1:]) 

вызовы к exist должны иметь два аргумента, а не один. И вы должны использовать or, а не +.

 return exists(seq[1:]) 

Вызовы exist должны иметь два аргумента, а не один.

print(exists("c", [a,[b,c],d])) 

[a,[b,c],d] означает «вложенный список, содержащий переменные с именами а, б, в, и г». Если у вас нет переменных с этими именами, это приведет к сбою с помощью NameError. Возможно, вы хотели использовать строковые литералы.

def exists(s, seq): 
    if not seq: 
     return False 
    elif isinstance(seq[0], list): 
     return exists(s, seq[0]) or exists(s, seq[1:]) 
    elif s == seq[0]: 
     return True 
    else: 
     return exists(s, seq[1:]) 

print(exists("c", ["a",["b","c"],"d"])) 
+0

большое спасибо! – user2831306

1

"Я получаю имя "а" не определен".

Это потому, что оно не определено, если это ваш полный код. То же самое относится к b, c и d.

Вам нужно либо определить эти переменные заранее (1) с некоторыми строковыми объектами, или писать письма, как сами строковых литералов (2.):

  1. a, b, c, d = "my_string1", "my_string2", "my_string3", "my_string4"
  2. print(exists('c', ['a', ['b', 'c'], 'd']))

Кроме того, вы определяете свою функцию как def exists(str, seq):, но вы вызываете ее как exists(seq[0]), что означает, что вам не хватает параметра.

Затем вы пытаетесь добавить логические значения, которые могут работать, но я не уверен, что это то, чего вы хотите достичь: return exists(seq[0]) + exists(seq[1:]). Если преобразовать в логическое значение, 2 также будет True. Но это также будет True, если одно из утверждений: 0. Чтобы проверить, являются ли оба или нет, True, вы должны умножить значения. Кроме того, попробуйте использовать один и тот же тип возврата для каждого случая возврата.

Вы также используете первый символ (или элемент) вашего seq, в то время как вы действительно хотели использовать первый символ строки str. Осторожный! str - это класс типа, НЕ используйте его как имя переменной.

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