В встроенном питоне нет счетчика? - PullRequest
0 голосов
/ 13 ноября 2018

Когда я пытаюсь вставить счетчик во встроенный цикл Python, он сообщает мне синтаксическую ошибку. Очевидно, здесь ожидается, что я назначу значение i, а не k.

Может ли кто-нибудь помочь с переписыванием встроенного цикла?

aa = [2, 2, 1]
k = 0

b = [k += 1 if i != 2  for i in aa ] 

print(b)

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Вы, кажется, неправильно поняли, что делаете.Это:

[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 - и оно также немного менее эффективно, потому что это решение фактически требует создания нового списка, который не нужен для чего-либо.вы пытаетесь достичь.

0 голосов
/ 13 ноября 2018

вы можете использовать len() как так

print(len([i for i in a if i != 2]))
...