Как избавиться от ошибки «строковый индекс вне диапазона» при попытке заменить несколько вхождений из списков?

#python

#python

Вопрос:

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

 #Finding their profession
#Declaring keywords for each profession
sportspersonKeywords = ['Sportsperson', 'Sportsman', 'Sportsman', 'Sports', 'Sport', 'Coach', 'Game', 'Olympics', 'Paralympics', 'Medal', 'Bronze', 'Silver', 'Gold', 'Player', 'sportsperson', 'sportsman', 'sportsman', 'sports', 'sport', 'coach', 'game', 'olympics', 'paralympics', 'medal', 'bronze', 'silver', 'gold', 'player', 'footballer', 'Footballer']

scientistKeywords = ['Scientist', 'Mathematician', 'Chemistry', 'Biology', 'Physics', 'Nobel Prize', 'Invention', 'Discovery', 'Invented', 'Discovered', 'science', 'scientist', 'mathematician', 'chemistry', 'biology', 'physics', 'nobel prize', 'invention', 'discovery', 'invented', 'discovered', 'science', 'Physicist', 'physicist', 'chemist', 'Chemist', 'Biologist', 'biologist']

politicianKeywords = ['Politician', 'Politics', 'Election', 'President', 'Vice-President', 'Vice President', 'Senate', 'Senator', 'Representative', 'Democracy', 'politician', 'politics', 'election', 'president', 'vice-president', 'vice president', 'senate', 'senator', 'representative', 'democracy']

#Declaring the first sentence (from the summary)
firstSentence = summary.split('.')[0]

profession = ['Scientist', 'Sportsperson', 'Politician']
professionFinal = ''

#Splitting the first sentence of the summary into separate words
firstSentenceList = firstSentence.split()

#Replacing each other character in the first sentence
counter = 0
print(firstSentenceList)
for i in firstSentenceList:
  x = [',', '.']
  if x[0] in i:
    firstSentenceList = firstSentenceList[counter].replace(',', '')
    counter  = 1
  elif x[1] in i:
    i = i.replace('.', '')
    counter  = 1
  else:
    counter  = 1
    continue
print(firstSentenceList)

#Checking each word in the first sentence against the keywords in each profession to try to get a match
for i in firstSentenceList:
  if i in sportspersonKeywords:
    professionFinal = profession[1]
    break
  elif i in scientistKeywords:
    professionFinal = profession[0]
    break
  elif i in politicianKeywords:
    professionFinal = profession[2]
    break

#if a match is found, then that person has that profession, if not, then their profession is not in our parameters
if professionFinal == '':
  print('[PROFESSION]: NOT A SPORTPERSON, SCIENTIST, OR POLITICIAN')
else:
  print('[PROFESSION]: '   professionFinal)
 

Все это было здорово для таких людей, как Альберт Эйнштейн, Серена Уильямс, Дональд Трамп и другие, но когда я искал Джеймса Уотсона. Просто чтобы уточнить, мне нужно было только найти их профессию из приведенных выше параметров. Если они не были ученым, спортсменом или политиком, не нужно идти дальше, просто скажите, что они не были ни тем, ни другим. К сожалению, я использую Repl.it , который не допускает точек останова и многих других вещей, поэтому мне пришлось вручную выполнять отладку, вводя print() инструкции, чтобы проверить, как все работает. Я обнаружил, когда напечатал firstSentenceList переменную, хранящую мое первое предложение (то, которое я использую для проверки ключевых слов), что она должна была распознать biologist, но этого не произошло, потому что за словом biologist следовала запятая; поэтому оно было указано так: 'biologist,' , что испортило поиск по ключевым словам. Этот код:

 #Replacing each other character in the first sentence
counter = 0
print(firstSentenceList)
for i in firstSentenceList:
  x = [',', '.']
  if x[0] in i:
    firstSentenceList = firstSentenceList[counter].replace(',', '')
    counter  = 1
  elif x[1] in i:
    i = i.replace('.', '')
    counter  = 1
  else:
    counter  = 1
    continue
print(firstSentenceList)
 

это то, что я только что вставил, чтобы попытаться заменить такие вещи, как запятые и точки в списке. Я попытался запустить его и, к сожалению, ошибки. Одним из которых было это:

Сообщение об ошибке 1 - quot;строковый индекс вне диапазонаquot;

Короче говоря, я не знаю, как заменить вышеупомянутые элементы из каждой строки в списке. Кто-нибудь, пожалуйста, научит меня, как это сделать. Опять же, для всех, кто видел мой другой пост и поражался тому, как мне удается сделать их такими длинными, извините за это.

** Ссылка на мой Repl.it : Проект веб-очистки Википедии — Brightbulb123 — Repl.it

Комментарии:

1. Я думаю, что регулярное выражение подойдет лучше… docs.python.org/3/library/re.html

Ответ №1:

Я думаю, что проблема в следующей строке:

     firstSentenceList = firstSentenceList[counter].replace(',', '')
 

Здесь вы присваиваете слово в позиции counter списку. Эффективная замена списка одним словом. Это устранит проблему:

     firstSentenceList[counter] = firstSentenceList[counter].replace(',', '')
 

То же самое относится и к . ( X[1] ) .

Лучшим подходом будет удаление , и . , когда вы перебираете список в этом блоке:

 for i in firstSentenceList:
    if i in sportspersonKeywords:
        professionFinal = profession[1]
        break
 

Нравится:

 for i in firstSentenceList:
    i = i.replace(',', '').replace('.', '')
    if i in sportspersonKeywords:
        professionFinal = profession[1]
        break
 

Ответ №2:

Проблема в строке:

 firstSentenceList = firstSentenceList[counter].replace(',', '')
 

В replace(',','') , вам нужно указать пробел, как .replace(',',' ')

Одним из предложений было бы преобразовать firstSentenceList в dictionary. Было бы проще с помощью пары ключей и значений решить проблему множественных вхождений.