В встроенном питоне нет счетчика?

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

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

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

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

print(b)

Это не «встроенный цикл». Составление списков - не лучший способ написать произвольные циклы for; они предназначены для списки зданий.

user2357112 supports Monica 13.11.2018 21:11
count = sum([i != 2 for i in aa ] )
Joran Beasley 13.11.2018 21:11

Что вы ожидали от b после этого?

user2357112 supports Monica 13.11.2018 21:11

Привет @ user2357112, в идеале я рассчитываю получить [2,1]. Чтобы подсчитать, сколько раз в списке появляется цифра «2», и оставить остальную часть списка в прежнем виде.

Bridget Huang 13.11.2018 21:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
711
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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» - это количество «ложных».

Bridget Huang 13.11.2018 21:52

Я не думаю, что вы сможете сделать это с пониманием списка. Это полезный инструмент, но это не похоже на то, что циклы for следует избегать или что-то в этом роде, и для такой задачи я бы просто использовал цикл for (в основном, выполняю что-то с конечным автоматом или что-то в этом роде)

Green Cloak Guy 14.11.2018 03:47

Спасибо за Ваш ответ!

Bridget Huang 14.11.2018 17:21

Другие вопросы по теме