#python #python-3.x #itertools
#python #python-3.x #python-itertools
Вопрос:
если это дубликат, уже ответил, тогда извините, я не сталкивался с этим вопросом
когда я читал itertools count, генерировать итератор с использованием цикла for легко, и я пытался сделать это в list comprehension, но я столкнулся с этой проблемой
from itertools import *
с помощью цикла for
for x in itertools.count(5,2):
if x > 20:
break
else:
print(x)
5
7
9
11
13
15
17
19
я пытался сделать это в list comprehension
[x if x<20 else break for x in count(5,2)]
File "<ipython-input-9-436737c82775>", line 1
[x if x<20 else break for x in count(5,2)]
^
SyntaxError: invalid syntax
я попробовал с помощью метода islice и получил ответ
[x for x in itertools.islice(itertools.count(5),10)]
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
без использования метода islice, как я могу выйти (используя break или любую другую вещь), используя только метод count?
дополнительно, как реализовать break
в list comprehensions
?
Комментарии:
1. Почему вам не нравится
islice
? Определенно нетbreak
понимания внутри списка, но естьtakewhile
.2. Почему вы не используете
range(5, 20, 2)
orrange(5, 15)
?3. дело не в симпатиях, я просто хочу знать, «могу ли я поступить таким образом или нет?» @bereal
4. я могу использовать диапазон, как я читал itertools, я пытался сделать с itertools @falsetru
Ответ №1:
Там нет break
понимания внутреннего списка или выражений генератора, но если вы хотите остановиться на определенном условии, вы можете использовать takewhile
:
>>> from itertools import takewhile, count
>>> list(takewhile(lambda x: x < 20, count(5, 2)))
[5, 7, 9, 11, 13, 15, 17, 19]
Комментарии:
1. Вы можете
list(takewhile(int(20).__gt__, count(5, 2)))
удалить уродливую лямбду, и это будет довольно, но быстрее.2. @PadraicCunningham быстрее, да, но я бы, возможно, усомнился в сравнительном уродстве.
3. Я имел в виду уродство как из-за накладных расходов, так и из-за визуального представления, лямбда-выражение с любым функциональным кодом — это смертельный удар по производительности, чего обычно вы пытаетесь достичь при использовании itertools, map, filter и т.д.
4. @avimatta Вы также можете принять ответ, это величайшее «Спасибо, это работает!»
5. @PadraicCunningham можете ли вы сказать мне «лямбда-выражение с любым функциональным кодом — это смертельный удар по производительности?»