2016-12-05 1 views
0

그래서 목록에있는 모든 항목이 참으로 평가 될 때만 상태가되기를 원합니다.Python의 불리언 목록에 최소/최대를 사용하고 있습니까?

def foo(): 
    # do something 
def bar(): 
    # do something 
def baz(): 
    # do something 

fncs = [foo, bar, baz] 
if <every element in [fnc() for fnc in fncs] evaluates to true>: 
    # do something 
나는 확실히이 작업을 수행 할 수 있습니다 알고

:

all_true = True 
for fnc in fncs: 
    if not fnc(): 
     all_true = False 
if all_true: 
    # do something 

그러나이의 예는 (설명하는 내 상황이지만 쉽게 실제로)를 부울을 반환하는 함수의 목록과 같은 수 있습니다 이 빈약 한 형태 인 경우, 궁금 : 또는

if min([fnc() for fnc in fncs]): 
    # do something 

내가 지능형리스트 동안 모든 거짓 요소를 선택하고 목록이 점유되어 있는지 확인을 시도 할 수 있습니다 (이 때문에 작동 첫 번째는 가장 쉬운 동안 나는 "분"같은 느낌

if not [None for fnc in fncs if not fnc()]: 
    # do something 

마지막 방법보다 훨씬 깨끗하고 : 편곡이 목록은 부울 (편곡)의 경우에만) 편곡이 비어있는 경우 False를 반환 초보자를 이해하기 위해서는 무슨 일이 일어나는지 분명해야합니다. 나는 번갈아 앨리어싱을 통해 명확하게 수 :

all_true = min 
if all_true([fnc() for fnc in fncs]): 
    # do something 

나는뿐만 아니라이 작업을 수행하는 다른 방법을 놓친 확신합니다. 어떤 방법이 가장 바람직한지 궁금하네요.

도움 주셔서 감사합니다.

+0

대부분의 언어가 목록에있는 모든 항목이 조건을 만족하는 경우 확인하는'every' 기능을 가지고있다. 나는 파이썬이 그러한 기능을 가지고 있다고 상상한다. – Carcigenicate

+7

iterable의 모든 것이 참인지를 알기 위해서는'all' 함수를 사용하십시오. –

+2

iterable의 항목 중 하나라도 true인지를 확인하는'any'가 있습니다. –

답변

2

min을 사용하는 것은 "불량"이 아니지만, 이며 불필요한 작업을 수행 할 것입니다. 대신 all을 사용해야합니다. 모든 값이 True을 경우이 True를 반환합니다

if all(fnc() for fnc in fncs): 
    # do something 

, 그렇지 않으면 False. 전체 시퀀스를 적어도 한 번 이상 실행해야하는 min과 달리 어떤 값이 False이면 조기 종료의 추가 이점이 있습니다.

모두가 False인지 평가해야하는 경우 비슷한 "가능한 한 빨리 종료"동작을하는 any (특히 not any(...))을 권장합니다.

1

당신은 아마 all 내장 함수를 찾고 :

print all(f() for f in [foo, bar, baz]) 
관련 문제