как применить BREAK для подсчета Itertools в понимании списка?

#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) or range(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 можете ли вы сказать мне «лямбда-выражение с любым функциональным кодом — это смертельный удар по производительности?»