Невозможно редактировать элементы списка внутри цикла - PullRequest
2 голосов
/ 04 апреля 2019

Я пытаюсь решить проблему, редактируя список, который отслеживает закрытые и открытые шкафчики в школе, код, который я получил, следующий:

y = list()
lockers = 100
students = 100
s = 2
i = 0
while i < lockers:
    y.append("O")
    i = i + 1
w = len(y)
while s <= students:
    for x in range(s, w, s):
        if y[x] == "O":
            y[x] = "C"
        if y[x] == "C":
            y[x] = "O"
    s = s + 1
openLockers = y.count("O")
print(openLockers)

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

y[x] = "C"

и

y[x] = "C"

Список не меняется вообще после этих строк.

Я добавил w, чтобы не использовать len(y) внутри функции диапазона, и я не могу использовать

for i in y

потому что мне нужно сделать шаг между элементами в цикле y.

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

Ответы [ 2 ]

5 голосов
/ 04 апреля 2019

В вашем коде есть несколько других мест, где его можно упростить, но ваша настоящая проблема здесь в цикле for:

if y[x] == "O":
    y[x] = "C"
if y[x] == "C":
    y[x] = "O"

Если шкафчик открыт, вы устанавливаете его как закрытый. Затем немедленно выполняется следующая инструкция if, возвращающая ее к открытию. Таким образом, вы, похоже, не меняете y. Измените второй оператор if на оператор elif:

if y[x] == "O":
    y[x] = "C"
elif y[x] == "C":
    y[x] = "O"

Это должно исправить вашу проблему.


Теперь это отдельно и не нужно, но немного упростит ваш код. Попробуйте это (использует логическое состояние вместо букв):

lockers = 100
students = 100
y = [False] * lockers

for s in range(2, students):
    for x in range(s, lockers, s):
        y[x] = not y[x]

openLockers = y.count(False)
print(openLockers)
1 голос
/ 04 апреля 2019

Если у вас есть только два возможных значения для y[x], которые 'O' и 'X', вы можете использовать следующее упрощение в своем коде:

y[x] = "C" if y[x] == "O" else "O"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...