2017-09-12 13 views
6

Tôi có chức năng f mất int và trả lại bool. Tôi muốn tìm số nguyên không âm tối thiểu x, trong đó f(x)False. Làm thế nào tôi có thể làm điều đó trong hầu hết các cách pythonic (lý tưởng một dòng)?Tìm số nguyên không âm tối thiểu, không thỏa mãn điều kiện


Sau đây là cách tôi làm điều đó bây giờ:

x = 0 
while f(x): 
    x += 1 
print(x) 

Tôi muốn một cái gì đó như:

x = <perfect one line expression> 
print(x) 
+0

Tôi không phải là một chuyên gia gì phương tiện pythonic, nhưng bạn ba dòng mã là những gì tôi sẽ viết và sẽ hài lòng với. – VPfB

+0

@VPfB, cuối cùng tôi sử dụng giải pháp ba dòng thay vì giải pháp một dòng, nhưng thật thú vị khi biết làm thế nào nó có thể được thực hiện trong một dòng :) – diraria

Trả lời

3

Ở đây nó được sử dụng next:

from itertools import count 
x = next(i for i in count() if not f(i)) 

Demo:

>>> def f(x): 
...  return (x - 42)**2 
... 
>>> next(i for i in count() if not f(i)) 
42 
3

Một cách tiếp cận chức năng tương tự với itertools.filterfalseitertools.count có thể

from itertools import filterfalse, count 

x = next(filterfalse(f, count())) 

Hoặc bạn có thể trao đổi trên filterfalse với dropwhile, mà trong khi performantly tương tự duy trì cùng một cú pháp trên Python 2 và 3 (nhờ rici).

from itertools import dropwhile, count 
x = next(dropwhile(f, count())) 
+0

Hoặc giảm, mặc dù khả năng tương thích 2.7 dường như không cần thiết. – rici

+0

@rici Tại sao lại bận tâm với 'dropwhile'? Tôi nghĩ rằng 'itertools.ifilterfalse' và cách tiếp cận tương tự chính xác sẽ hoạt động tốt. – miradulo

+1

Tôi không ngụ ý ngụ ý rằng sự sụt giảm tốt hơn, nhưng dường như tôi cũng không tệ hơn. Nó chỉ là một thay thế xảy ra để có cùng một chính tả trong cả hai phiên bản Python. – rici

1

Nếu bạn muốn một dòng duy nhất mà không cần nhập khẩu, một trong những cách có thể là một danh sách hiểu (Python 2.7/PyPy):

def f(x): 
    return True if x == 5 else False 

x = [g(0) for g in [lambda x: x if f(x) else g(x+1)]][0] 

print(x) 
Các vấn đề liên quan