2011-03-31 29 views
15

tôi có thể sử dụng iffor trong danh sách comprehensions/biểu thức máy phát điện nhưSử dụng trong khi trong danh sách hiểu hoặc tạo ra cụm từ

list(i for i in range(100) if i*i < 30) 

Tôi biết điều này là không hiệu quả nhất nhưng chịu với tôi như tình trạng này có thể là nhiều hơn nữa phức tạp và đây chỉ là một ví dụ. Tuy nhiên, đây vẫn đi qua trăm lần lặp và chỉ mang lại một giá trị trong 6. đầu tiên Có cách nào để nói với các biểu hiện phát nơi để dừng lại với một cái gì đó như thế này:

list(i for i in range(100) while i*i < 30) 

Tuy nhiên, while không hiểu máy phát điện biểu thức. Vì vậy, câu hỏi của tôi là, làm thế nào để tôi viết một biểu thức máy phát điện với một điều kiện dừng để nó không tiếp tục tính toán, ngay cả khi nó không mang lại giá trị mới.

+1

Chỉ cần lưu ý: bạn có thể tạo danh sách trực tiếp bằng cách sử dụng '[i cho i trong phạm vi (100)]' – Joril

+0

Thật kỳ lạ, đã có [PEP3142] (https://www.python.org/dev/peps/ pep-3142 /) mở tại thời điểm câu hỏi này được hỏi. Các trường hợp sử dụng được đưa ra là gần như chính xác này. Guido nuked nó tháng năm, 2013 –

Trả lời

9

Các chức năng khác nhau trong itertools (takewhile() đến với tâm trí) có thể hữu ích.

20

Bởi vì cú pháp của takewhile()dropwhile() không phải là rõ ràng nhất , đây là những ví dụ thực tế của câu hỏi của bạn:

>>> [i for i in itertools.takewhile(lambda x: x*x<30, range(10))] 
[0, 1, 2, 3, 4, 5] 
>>> [i for i in itertools.dropwhile(lambda x: x*x<30, range(10))] 
[6, 7, 8, 9] 

Biết rằng tác giả của itertools has questioned dù không chấp các chức năng này.

+0

Công thức sẽ là gì trong trường hợp các chức năng này không được chấp nhận? – highBandWidth

+0

Chỉ cần xem tài liệu Python cho [itertools.takewhile] (http://docs.python.org/library/itertools.html#itertools.takewhile) và [itertools.dropwhile] (http://docs.python.org /library/itertools.html#itertools.dropwhile). Mỗi cái có tương đương Python thẳng. – dawg

+6

không chỉ là 'danh sách (itertools.takewhile (lambda x: x * x <30, phạm vi (10)))' dễ hiểu hơn ở đây – wim

Các vấn đề liên quan