2014-09-13 4 views
2

У меня есть простая задача выбрать все элементы из списка (отсортированного по убыванию), которые лежат над заданным элементом. т.е.Нарушение цикла в понимании списка в python

X=[32,28,26,21,14,11,8,6,3] 
Threshold=12 
Result=[32,28,26,21,14] 

То, что я изначально было что-то простое, как

FullList=[x for x in FullList if x>=Threshold] 

Однако, поскольку список отсортирован, я могу (и нужно) перерыв между ними.

После долгих ударов головой и красивого учебника here я наконец придумал следующее решение.

def stopIteration(): 
     raise StopIteration 

FullList=list(x if x>=Threshold else stopIteration() for x in FullList) 

Однако, когда я пишу следующее заявление, он дает мне ошибку синтаксиса:

FullList=list(x if x>=Threshold else raise StopIteration for x in FullList) 

Что является причиной такого поведения?

+0

'х, если х> = Порог еще поднять StopIteration' не является допустимым выражением, потому что' поднять StopIteration' не имеет значения, поэтому он не может быть добавлен к списку. По какой причине вы не просто используете для этого цикл? – khelwood

+0

Вы должны были прочитать учебник, о котором вы говорили более тщательно. Он отвечает на ваш конкретный вопрос (не действительное выражение) и упоминает использование itertools.takewhile, а также несколько хакерский (IMO) метод, используя определенную пользователем функцию stopif() для повышения StopIteration в неявном контуре понимания - это действительно довольно хороший учебник. –

ответ

6

raise - инструкция, но внутри другого выражения вы можете использовать выражения.

Кроме того, почему бы не использовать itertools.takewhile?

full_list = list(itertools.takewhile(lambda x: x >= threshold, full_list)) 
Смежные вопросы