2016-10-23 8 views
3

, если это дубликат, уже ответил тогда извините, я не наткнулся на этот вопросКак применить BREAK для подсчета Itertools в List Comprehensions?

, как я читал подсчитывать itertools, генерируя итератор используя для цикла легко, и я пытался сделать это в списке понимание но я столкнулся с этой проблемой

from itertools import * 

, используя для петли

for x in itertools.count(5,2): 
    if x > 20: 
     break 
    else: 
     print(x) 
5 
7 
9 
11 
13 
15 
17 
19 

я попытался сделать это в списке понимание

[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 

я попытался с помощью метода Ислицы и я получил ответ

[x for x in itertools.islice(itertools.count(5),10)] 
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14] 

без использования метода Ислицы, как я могу выйти (используя перерыв или любую вещь), используя только подсчитывать метод?

Кроме того, как реализовать «перерыв» в списках?

+0

Почему вам не нравится 'islice'? Там определенно не 'break' внутри списка, но есть [' takewhile'] (https://docs.python.org/3/library/itertools.html#itertools.takewhile). – bereal

+1

Почему вы не используете 'range (5, 20, 2)' или 'range (5, 15)'? – falsetru

+0

Это не нравится, я просто хочу знать, что «могу я сделать так или нет?» @bereal – avimatta

ответ

5

Там нет break внутри списковых или выражений генератора, но если вы хотите остановиться на определенных условиях, вы можете использовать takewhile:

>>> from itertools import takewhile, count 
>>> list(takewhile(lambda x: x < 20, count(5, 2))) 

[5, 7, 9, 11, 13, 15, 17, 19]

+0

takewhile ha, спасибо – avimatta

+1

Вы можете «перечислить (takewhile (int (20) .__ gt__, count (5, 2))) 'удалить уродливую лямбду, и это будет довольно быстро, но быстрее. –

+0

@PadraicCunningham быстрее да, но я, возможно, поставил бы вопрос о сравнительном уродстве. – bereal