В то время как цикл, похоже, не повторяется после 1 итерации

#python #list #while-loop

Вопрос:

Добрый день. Я новичок в кодировании и python.

Моя цель-попытаться создать код, в котором, если элемент в y достигнет следующего 0, все значения от 0 до n (до следующего нуля) станут n. Пример вывода должен выглядеть следующим образом после выполнения приведенного ниже кода:

 y = [0,1,2,3,4,5,6,7,8,0,1,0,1,2,3,4,5,6,7]

# I am interating over two inputs. y_1 = y[1:] and append 0 at the end.
y_1 = [1,2,3,4,5,6,7,8,0,1,0,1,2,3,4,5,6,7,0]

expected output:
x = [8, 8, 8, 8, 8, 8, 8, 8, 8, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7]
 

Проблема, с которой я сталкиваюсь, я полагаю, связана с тем, что цикл while не повторяется после [0,1,2,3,4,5,6,7,8] удаления из списка, как указано в приведенном ниже коде (который, по логике, должен повторяться?) :

 y = [0,1,2,3,4,5,6,7,8,0,1,0,1,2,3,4,5,6,7]
y_1 = [1,2,3,4,5,6,7,8,0,1,0,1,2,3,4,5,6,7,0]

x = []

while len(y):
    for i, j in zip(y, y_1):
        if i > j:
            z = i
        
            for k in range(z 1):
                x.append(y[i])
            
            del y[0:z 1]
            del y_1[0:z 1]
    
        elif i == j:
            z = 0
            
            x.append(z)
            
            del y[z]
            del y_1[z]
 

Любое предложение будет с благодарностью воспринято 🙂

Комментарии:

1. Вы не должны удалять из списка, который вы повторяете.

2. y_1 в этом коде-это y[1:] с добавлением 0 в конце

3. не используйте del , потому что это изменяет список, который вы используете в for цикле, zip(y, y_1) и он может остановить его раньше, чем вы ожидаете. Кроме того, вам не нужно удалять его, чтобы получить ожидаемый результат. И удалите while len(y) — вам это тоже не нужно.

4. короче y_1 = y[1:] [0]

Ответ №1:

Я не знаю, почему вы используете del и while потому что вы должны получить ожидаемый результат, делая

 y   = [0,1,2,3,4,5,6,7,8,0,1,0,1,2,3,4,5,6,7]
y_1 = y[1:]   [0]

x = []

for i, j in zip(y, y_1):
    if i > j:
        z = i
        for k in range(z 1):
            x.append(y[i])
    elif i == j:
        z = 0
        x.append(z)

print(x)
 

В Python вы не должны удалять элемент из списка, который вы используете как for цикл, потому что, когда он удаляет элемент, он перемещает другие элементы в список, используемый как for цикл, и это может дать неожиданные результаты.
Если вы действительно хотите запустить его в некоторых while len(y) , то вам лучше создать новый список с элементами, которые вы хотите сохранить. Или вы должны дублировать список — y_duplicated = y.copy() — и удалить в дублированном списке, а после for цикла заменить исходный список y = y_duplicated

Комментарии:

1. Спасибо! это помогло решить мою проблему. 🙂 Моя логика заключалась в том, чтобы удалить элементы, чтобы индекс начинался с нуля. Следовательно, используйте цикл while до тех пор, пока исходный список не опустеет. Я не знал о неожиданных результатах при удалении списка в циклическом действии.