Где поместить условие if в понимание списка? - PullRequest
0 голосов
/ 26 сентября 2018

Мне дали функцию:

x**2 - 4*x + 6

, и задача состояла в том, чтобы найти минимальные целочисленные значения x между 0 и 10. Мне пришлось использовать цикл for:

for i in range(11):
    if 2*i-4==0:
        print("Minimum of the given function is:", i)

, который дает мне правильный ответ 2.

Теперь я должен перевести это как понимание списка, но я не знаю, куда поместить выражение if:

mylist = [2*i-4==0 for i in range(11)]
print(mylist)

Конечно, в качестве вывода я получаю список true / false с индексом 2, являющимся правильным true.Но как мне включить if в моём понимании списка?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Вы находите одиночное значение , а не список значений.Понимание списка здесь не имеет большого смысла.

Ваша ошибка в том, что вы помещаете свой тест в раздел выражение значения в понимании списка.Это не фильтр, это та часть, где вы строите новые значения списка из (отфильтрованных) элементов цикла.

Поставьте 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)
0 голосов
/ 26 сентября 2018

, если вы действительно хотите использовать здесь понимание, а не классический цикл, поскольку есть только один результат, вы можете передать генератор в next со значением по умолчанию на тот случай, если он не 'ничего не найти:

next((i for i in range(11) if 2*i-4==0),None)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...