Когда я пытаюсь включить счетчик во встроенный цикл Python, он сообщает мне синтаксическую ошибку. По-видимому, здесь ожидается, что я присвою значение i, а не k.
Может ли кто-нибудь помочь с переписыванием встроенного цикла?
aa = [2, 2, 1]
k = 0
b = [k += 1 if i != 2 for i in aa ]
print(b)
count = sum([i != 2 for i in aa ] )Что вы ожидали от b после этого?
Привет @ user2357112, в идеале я рассчитываю получить [2,1]. Чтобы подсчитать, сколько раз в списке появляется цифра «2», и оставить остальную часть списка в прежнем виде.






вы можете использовать len() так
print(len([i for i in a if i != 2]))
Кажется, вы неправильно понимаете, что делаете. Этот:
[x for y in z]
не является «встроенным циклом for». Цикл for может выполнять что-либо, повторяя любой повторяемый объект. Одна из вещей, которые может сделать цикл for, - это создать список элементов:
my_list = []
for i in other_list:
if condition_is_met:
my_list.append(i)
Понимание списка охватывает только этот вариант использования цикла for:
my_list = [i for i in other_list if condition_is_met]
Вот почему это называется «понимание списка», а не «встроенный цикл for» - потому что это только создает списки. Для других вещей, для которых вы можете использовать цикл for, например для итерации числа, вы не можете напрямую использовать понимание списка для выполнения.
Для вашей конкретной проблемы вы пытаетесь использовать k += 1 в понимании списка. Эта операция ничего не возвращает - она просто изменяет переменную k, поэтому, когда python пытается назначить ее элементу списка, операция завершается ошибкой. Если вы хотите посчитать с k, вам следует просто использовать обычный цикл for:
for i in aa:
if i != 2:
k += 1
или используйте понимание списка, чтобы измерить косвенно то, что вы хотите:
k += len([i for i in aa if i != 2])
Здесь мы используем понимание списка для создания списка каждого элемента i в aa, такого как i != 2, затем мы берем количество элементов в этом списке и добавляем его к k. Поскольку эта операция фактически создает собственный список, код не выйдет из строя и будет иметь тот же общий эффект. Это решение не всегда выполнимо, если у вас есть более сложные вещи, которые вы хотели бы сделать в цикле for - и оно также немного менее эффективно, потому что это решение требует фактического создания нового списка, который не является необходимым для того, что вы ' повторно пытаюсь достичь.
Очень исчерпывающий ответ! Очень признателен. Могу я задать еще один вопрос? Можно ли реализовать «понимание списка» и итерацию одновременно? Например. Чтобы преобразовать [True, False, False, False, True] в [0,3,4]. «0» и «4» представляют позицию, а «3» - это количество «ложных».
Я не думаю, что вы сможете сделать это с пониманием списка. Это полезный инструмент, но это не похоже на то, что циклы for следует избегать или что-то в этом роде, и для такой задачи я бы просто использовал цикл for (в основном, выполняю что-то с конечным автоматом или что-то в этом роде)
Спасибо за Ваш ответ!
Это не «встроенный цикл». Составление списков - не лучший способ написать произвольные циклы
for; они предназначены для списки зданий.