Как проверить условие функции внутри понимания списка в Python

#python #list-comprehension

Вопрос:

Привет, я пытался выяснить, есть ли способ это сделать.

 number_list = [d(x) for x in range(1, 10001) if d(x) < 10000]
 

Я хочу использовать понимание списка примерно так.

Итак, в принципе, я хочу иметь элементы списка с результатом функции, который меньше 10000.

Есть ли способ проверить состояние функции и поместить ее в список с помощью понимания списка?

Комментарии:

1. Ты пробовал это сделать?

2. да, я пробовал, но это принесло мне ценность более 10000. Я хочу получить значение меньше 10000 после оценки функции

3. что такое d(), не могли бы вы показать код d().

4. Ваш код должен работать @Chris , не могли бы вы, пожалуйста, добавить определение d

5. извините, ребята, определенно понимание этого списка работает. это была моя проблема с возвращением значения функции ‘d()’

Ответ №1:

начните с генератора

 a_generator = (d(x) for x in a_list)
# a generator will only evaluate when iterated
my_list = [v for v in a_generator if v < 1000]
# all values should be less than 1000 in this example
max(my_list) # better be less than 1000
 

если значения в a_list отсортированы от низкого до высокого и правило

d(x) < d(x 1) после этого вы можете оптимизировать его дальше

 import itertools
a_generator = (d(x) for x in my_sorted_list)
my_list = list(itertools.takewhile(lambda v:v < 1000, a_generator))
# this one will only calculate while the result meets the condition
# once a single value exceeds it will stop taking values
 

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

 [v for v in (d(x) for x in a_list) if v < 1000]
 

и

 list(itertools.takewhile(lambda v:v < 1000,  (d(x) for x in my_sorted_list)))
 

соответственно, но в будущем вы и все, с кем вы работаете, вероятно, предпочтете, чтобы это было в 2 строках

Комментарии:

1. большое вам спасибо! Я научился другому способу решения этой проблемы

Ответ №2:

Вы можете написать понимание следующим образом:

 res = [d(x) if d(x) < 10000 else None for x in range(1, 10001)]
number_list = [i for i in res if i is not None]
 

Понимание списка может иметь два места, где можно использовать if/else:

 foo = [{x if <smth> else y if <smth_else> else z} for i in range(1000) {if i % 2 == 0}]
 

Первый оператор if-else (внутри первой пары фигурных скобок) определяет, что именно нужно поместить в ваш список, а второй оператор if (вторая пара фигурных скобок) определяет, когда это нужно сделать.

Примечание: фигурные скобки предназначены только для отображения. Они не должны использоваться в реальном коде.

Например, понимание списка FizzBuzz будет выглядеть следующим образом:

 fb = ['FizzBuzz' if i % 15 == 0 
      else 'Fizz' if i % 3 == 0 
      else 'Buzz' if i % 5 == 0 
      else str(i) 
      for i in range(1, 100)]
 

ПРАВКА: Обновлено в соответствии с комментарием Джорана. Я забыл, что утверждение else необходимо при использовании if-else в передней части понимания.

Комментарии:

1. ваш первый пример неверен … вам ПОНАДОБИТСЯ предложение else, использующее if с этой стороны для

2. @JoranBeasley О да, вы правы. Я сейчас все исправлю.