Вы находите одиночное значение , а не список значений.Понимание списка здесь не имеет большого смысла.
Ваша ошибка в том, что вы помещаете свой тест в раздел выражение значения в понимании списка.Это не фильтр, это та часть, где вы строите новые значения списка из (отфильтрованных) элементов цикла.
Поставьте if
после части цикла for
:
[i for i in range(11) if 2 * i - 4 == 0]
Это создает список только с одним элементом, значение i
, для которого значение равно true:
>>> [i for i in range(11) if 2 * i - 4 == 0]
[2]
Если вы должны сделать это в одной строке, используйте выражение генератора , затем используйте функцию next()
, чтобы получить первый результат из этого:
gen = (i for i in range(11) if 2 * i - 4 == 0)
result = next(gen)
Это даст вамминимальное значение для i
, даже если должно быть несколько возможных значений для i
, где тест if
будет истинным.
Генератор лениво оценивается;цикл останавливается в тот момент, когда i
достигает значения, при котором тест if
является истинным, и создается это одно значение.next()
возвращает только это первое значение, поэтому больше итераций не происходит.Это как если бы вы использовали break
в цикле for
(за исключением того, что вы можете продолжить цикл позже).
Обратите внимание, что это может вызвать исключение StopIteration
, если генератор не выдает любые значения .Вы можете указать next()
вернуть значение по умолчанию в этом случае;второй аргумент next()
возвращается, если StopIteration
будет вызвано иначе:
result = next(gen, None)
Вы можете объединить выражение генератора в вызове next()
;если выражение генератора является единственным аргументом, вы можете опустить (...)
круглые скобки выражения генератора, в противном случае включите их, чтобы их можно было отличить от других аргументов:
result = next((i for i in range(11) if 2 * i - 4 == 0), None)