Удалить элемент из списка или установить, если он содержит определенный символ - PullRequest
2 голосов
/ 05 марта 2020

Мне дают текстовый файл месяцев, которые я открываю и заполняю в виде списка или набора. Мне нужно перебрать список и удалить все месяцы, в которых есть буква «r» или «R». Я попробовал это, используя и наборы и списки, но продолжаю получать RuntimeError. Вот мой код для использования набора:

monthList = {}

def main():
    monthList = fillList()
    print(monthList)
    removeRMonths(monthList)

def fillList():
    infile = open("SomeMonths.txt")
    monthList = {line.rstrip() for line in infile}
    return monthList

def removeRMonths(monthList):
    for month in monthList:
        for ch in month:
            if ch == "r" or ch == "R":
                monthList.remove(month)
    print(monthList)

main()

Я получаю ошибку:

Traceback (most recent call last):
  File "/Users/hwang/Desktop/Week7.py", line 115, in <module>
    main()
  File "/Users/hwang/Desktop/Week7.py", line 99, in main
    removeRMonths(monthList)
  File "/Users/hwang/Desktop/Week7.py", line 107, in removeRMonths
    for month in monthList:
RuntimeError: Set changed size during iteration
>>> 

Это мой код пытается использовать список:

monthList = ()

def main():
    monthList = fillList()
    print(monthList)
    removeRMonths(monthList)

def fillList():
    infile = open("SomeMonths.txt")
    monthList = (line.rstrip() for line in infile)
    return monthList

def removeRMonths(monthList):
    for month in monthList:
        for ch in month:
            if ch == "r" or ch == "R":
                monthList.remove(month)
            else:
                continue
    print(monthList)

main()

Моя ошибка:

Traceback (most recent call last):
  File "/Users/hwang/Desktop/Week7.py", line 117, in <module>
    main()
  File "/Users/hwang/Desktop/Week7.py", line 99, in main
    removeRMonths(monthList)
  File "/Users/hwang/Desktop/Week7.py", line 110, in removeRMonths
    monthList.remove(month)
AttributeError: 'generator' object has no attribute 'remove'

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

1 Ответ

4 голосов
/ 05 марта 2020

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

Используйте понимание списка, чтобы создать список в первую очередь. Затем используйте другое понимание списка, чтобы отфильтровать элементы. Наконец, используйте назначение срезов, чтобы обновить исходный список на месте после выполнения фильтрации.

monthList = ()

def main():
    monthList = fillList()
    print(monthList)
    removeRMonths(monthList)

def fillList():
    infile = open("SomeMonths.txt")
    monthList = [line.rstrip() for line in infile]
    return monthList

def removeRMonths(monthList):
    monthList[:] = [month for month in monthList if 'r' not in month.lower()]
    print(monthList)
...