«Ошибка значения: list.remove (x): x отсутствует в списке», когда x находится в списке

#python

#python

Вопрос:

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

  goodwords=["a", "my", "the", "I", "long", "up", "on"] 
 count=[26, 16, 16, 15, 12, 11, 11 ]
  

Итак, я написал этот код для фильтрации коротких слов.

 for word in goodwords:
if len(word)<3:
        goodwords.index(word)
        count.remove(goodwords.index(word))
        goodwords.remove(word)

        
  

Python выдает мне эту ошибку:

Ошибка значения: list.remove (x): x отсутствует в списке

Даже когда я пытаюсь присвоить индекс слова int, отображается та же ошибка.

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

1. Почему вы не использовали словарь для этого?

2. Вы пытаетесь использовать remove один раз для удаления слова и один раз для удаления индекса — он не может сделать и то, и другое.

3. @ThierryLathuille они удаляются из двух разных списков.

4. goodwords.index гарантированно возвращает число, меньшее длины goodwords , которое равно 7; поэтому список count , содержащий только числа, превышающие 10, не может содержать значение, которое вы пытаетесь удалить. Почему вы считаете, что ваш код правильный?

5. @bereal То, что я имел в виду, вероятно, было неясно: OP пытается один раз удалить слово, передав его remove , и один раз удалить счетчик, передав его индекс remove , но один и тот же метод не может работать одним способом в одном случае и другим способом в другом случае. Он имел в виду использовать del во втором случае.

Ответ №1:

Вы не должны изменять список во время итерации по нему. Ваши индексы меняются, когда вы что-то удаляете. Tr для упрощения задачи.

Я бы сохранил количество слов в словаре:

 goodwords = ["a", "my", "the", "I", "long", "up", "on"]
count = [26, 16, 16, 15, 12, 11, 11 ]
wordcounts = dict(zip(goodwords, count))
  

Чтобы иметь только более длинные слова, отфильтруйте их:

 wordcounts = {word: c for word, c in wordcounts.items()
              if len(word) > 3}
  

Кстати, вы можете выполнить первую часть задания, используя встроенный collections.Counter :

 >>> wordcounts = collections.Counter("one word and one more word".split())
>>> wordcounts
Counter({'one': 2, 'word': 2, 'and': 1, 'more': 1})
  

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

1. Это было бы отличным решением, спасибо. Но python выдает мне ошибку «недопустимый синтаксис» для второй (фильтрующей) части вашего кода. Я не настолько хорош в понимании. Не могли бы вы объяснить?

2. @TavaSencaSencis У меня была ошибка wordcounts = dict(zip(goodwords, count) . Я забыл закрыть последнюю круглую скобку. Это могло отображаться как ошибка в строке после нее. Попробуйте сейчас.

Ответ №2:

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

 for word in allwords:
if len(word)>3:
        goodwords.append(word)