#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 О да, вы правы. Я сейчас все исправлю.