Я пытаюсь удалить из списка все слова длиной до 4 символов, но это не работает - PullRequest
1 голос
/ 16 мая 2019

У меня есть этот код, который должен удалить все слова из списка длиной до 4 символов, но он просто удаляет некоторые слова (я не уверен, какие), но определенно не все из них:

#load in the words from the original text file
def load_words():
    with open('words_alpha.txt') as word_file:
        valid_words = [word_file.read().split()]

    return valid_words


english_words = load_words()
print("loading...")

print(len(english_words[0]))
#remove words under 4 letters
for word in english_words[0]:
    if len(word) < 4:
        english_words[0].remove(word)

print("done")
print(len(english_words[0]))

#save the remaining words to a new text file
new_words = open("english_words_v3.txt","w")
for word in english_words[0]:
    new_words.write(word)
    new_words.write("\n")

new_words.close()

Это выводит это:

loading...
370103
done
367945

В words_alpha.txt есть 67000 слов с английского языка

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Вы хотите перебрать копию english_words, взяв ее копию с помощью english_words[0][:]. Прямо сейчас вы перебираете тот же список, который вы модифицируете, что вызывает странное поведение. Таким образом, цикл for будет выглядеть как

for word in english_words[0][:]:
    if len(word) < 4:
        english_words[0].remove(word)

Также вы можете упростить свой первый цикл for с помощью списочного понимания, и вам не нужно переносить word_file.read().split() в список, поскольку он уже возвращает список

Итак, ваш код будет выглядеть как

#load in the words from the original text file
def load_words():
    with open('words_alpha.txt') as word_file:
        #No need to wrap this into a list since it already returns a list
        valid_words = word_file.read().split()

    return valid_words

english_words = load_words()

#remove words under 4 letters using list comprehension
english_words = [word for word in english_words if len(word) >= 4]

print("done")
print(len(english_words))

#save the remaining words to a new text file
new_words = open("english_words_v3.txt","w")
for word in english_words:
    new_words.write(word)
    new_words.write("\n")

new_words.close()
0 голосов
/ 16 мая 2019

Попробуйте это с списком :

print([word for word in english_words[0] if len(word) >= 4])

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...