2014-11-14 4 views
0

У меня есть функция, которая принимает 2 аргумента - строку ввода и список слов. Для каждого слова в списке, который присутствует в строке, функция возвращает «True», иначе «False».IndexError со списком в Python

Мой код приведен ниже:

#!/usr/bin/python 


# inputStr is a string, inputList is list of strings 

def keyword_usage(inputStr, inputList): 

    splitStr = inputStr.split(); 
    L = []; 
    k = 0; 
    bool = 0; 

    for i in range(0,len(inputList)): 

     for j in range(0, len(inputStr)): 

      if inputList[i]==splitStr[j]: 
       bool = 1; 
      else: 
       bool = 0; 
     if bool==1: 
      L[k] = "True"; 
     else: 
      L[k] = "False"; 
     k+=1; 
    return tuple(L); 

Я бегу его в интерпретаторе, как показано ниже:

>>> from keyword_usage import keyword_usage 
>>> res = keyword_usage('Dive Into Python', ['Python', 'python', 'scala']) 

Когда я нажимаю войти, я получаю это:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "keyword_usage.py", line 17, in keyword_usage 
    if inputList[i]==splitStr[j]: 
IndexError: list index out of range 

Я новичок в кодировании Python и очень смущен. Кажется, основной вопрос, но я не мог получить никакого ответа на каком-либо форуме. Может ли кто-нибудь обнаружить ошибку? Заранее спасибо!!

ответ

1

Используйте это:

def keyword_usage(inputStr, inputList): 
    splitStr = inputStr.split(); 
    L = [] 
    b = False 
    for i in range(0,len(inputList)): 
     for j in range(0, len(inputStr)): 
      b = inputList[i]==splitStr[j] 
     L.append(b) 
    return tuple(L) 

print keyword_usage('Dive Into Python', ['Python', 'python', 'scala']) 

Вы сделали много ошибок:

  • Python не использует ';'
  • Не используйте 0 или 1 как булево, но вместо этого используйте True и False.
  • Теперь вы можете сохранить Истина или Ложь в том, что логическое
  • В seccond петле, я думаю, что вы Мента splitStr вместо inputList

И ошибка была вызвана:

L[k] = "True"; 

С У L пока нет предметов, вы не можете добавлять предметы таким образом.Используйте вместо добавления:

L.append("True") 

Ouput Сейчас:

(True, False, False) 
+0

Большое вам спасибо за помощь и информацию! На самом деле я добавил «;» из-за ошибок, которые я продолжал получать, и да, я имел в виду splitStr. – user3033194

0

Это похоже только на опечатку.

Это:

for j in range(0, len(inputStr)): 

Должно быть так:

for j in range(0, len(splitStr)): 
0

print len(splitStr)

дает: - 3

print len(inputList), len(inputStr) 

дает: - 3, 18

при проверке

if inputList[i]==splitStr[j] #for i = 1 and j = 12 

в то время как splitStr только три значения ['Dive', 'Into', 'Python']

при запуске for j in range(0, len(inputStr)) это будет цикл 18 раз НФА каждый раз j принимает значения из (0,18), поэтому он проверяет splitStr[j] скажем, 10 затем splitStr[10] который фактически (['Dive', 'Into', 'Python']) вне допустимого диапазона.

2

Я хотел бы предложить более вещий решение:

def keyword_usage(inputStr, inputList): 
    splitStr = inputStr.split() 
    L = [] 
    for i in inputList: 
     L.append(i in splitStr) 
    return tuple(L) 

Вот оно!

Используйте оператора in. Он проверяет, присутствует ли элемент в списке и возвращает True или False.

'Dive' in ['Python', 'python', 'scala'] 
>>> False 
'Python' in ['Python', 'python', 'scala'] 
>>> True 
+0

Спасибо за эту информацию, я не знал, что это может быть так просто! – user3033194

+1

Теперь вы знаете. Python - это просто и элегантно, но требуется время, чтобы получить просветленный мудростью :) – cezar

1

И давайте сделаем это на шаг дальше. Учитесь знать списки понимания:

def keyword_usage(inputStr, inputList): 
    splitStr = inputStr.split() 
    L = [i in splitStr for i in inputList] 
    return tuple(L) 

Теперь вы можете запустить функцию:

keyword_usage('Dive Into Python', ['Python', 'python', 'scala']) 
>>> (True, False, False) 

Но я бы Продолжим функцию даже на шаг дальше:

def keyword_usage(inputStr, inputList): 
    splitStr = inputStr.split() 
    L = [i in splitStr for i in inputList] 
    return dict(zip(inputList, L)) 

Теперь у вас есть это результат:

keyword_usage('Dive Into Python', ['Python', 'python', 'scala']) 
>>> {'Python': True, 'python': False, 'scala': False} 

Итак, вы сразу узнаете, какой элемент списка был найден в строке.

Вы можете переписать список понимание, как это:

L = [(i in splitStr) for i in inputList] 

для лучшей читаемости, если вам это нравится больше.

Встроенная функция zip объединяет два списка вместе, первый элемент списка A с первым элементом списка B, второй элемент списка A со вторым элементом списка B и т. Д. Затем встроенная функция dict делает хороший словарь этих значений.

Наслаждайтесь!

+0

wow .. еще раз спасибо! – user3033194

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