#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)