Причина того, что питону не хватает памяти, когда циклы используются для поиска по спискам - PullRequest
0 голосов
/ 02 февраля 2019

Это вопрос, для которого мне нужно было написать программу:

Напишите программу, чтобы открыть файл romeo.txt и прочитать его построчно.Для каждой строки разбейте строку на список слов, используя функцию разделения.Для каждого слова проверьте, есть ли слово в списке.Если слова нет в списке, добавьте его в список.Когда программа завершит работу, отсортируйте и распечатайте полученные слова в алфавитном порядке.

Текстовый файл содержит следующие строки:

Но мягко, что свет через те окна разбивает Это восток, а Джульеттасолнце Встань светлое солнце и убей завистливую луну, которая уже больна и бледна от горя

Я пытаюсь понять, почему Python возвращает «MemoryError», когда я использую этот код:

fhand=open("romeo.txt")
binlist=["a"]
for myline in fhand:
    myline=myline.rstrip()
    mylist=myline.split()
    for word in mylist:
        for binword in binlist:
            if word==binword:
                continue
            else:
                binlist.append(word)
binlist.sort()
print(binlist)

Тем не менее, этот код работает хорошо:

fhand=open("romeo.txt")
binlist=[]
for myline in fhand:
    myline=myline.rstrip()
    mylist=myline.split()
    for word in mylist:
        if word in binlist:
            continue
        else:
            binlist.append(word)
binlist.sort()
print(binlist)

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

С первым кодом вы добавляете слова в список несколько раз, даже если слово уже есть в binlist.Вы также изменяете (добавляете) список во время циклического перемещения по одному и тому же списку, что приводит к постоянно расширяющемуся списку и циклу, который никогда не заканчивается.

Возможно, вы захотите сделать это с помощью набора вместо

fhand=open("romeo.txt")
binlist={}
for myline in fhand:
    set.update(myline.split())
binlist = sorted(binlist)
print(binlist)
0 голосов
/ 02 февраля 2019

Проверьте логику вашего внутреннего цикла for.Вы говорите:

For each word in binlist:
    If word is EQUAL to binword, then proceed to the next word
    If word is NOT equal to binword, then add it to the end of binlist

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

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