Вы, кажется, неправильно поняли, что делаете.Это:
[x for y in z]
не является «встроенным циклом».Цикл 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]
Вот почему это называется «понимание списка», а не «inline for loop» - потому что создает только списки .Другие вещи, для которых вы можете использовать цикл 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
- и оно также немного менее эффективно, потому что это решение фактически требует создания нового списка, который не нужен для чего-либо.вы пытаетесь достичь.