python any(), all() 로 코드를 깔끔하게 작성해보자

개인적으로 간결하다고 느낀 any() function 에 대한 설명

It’s like an efficient “or” for more than 2 variables

개인적으로 간결하다고 느낀 all() function 에 대한 설명

It’s like an efficient “and” for more than 2 variables


예제를 통해 any() function 을 이해해보자.

1
2
3
4
5
6
7
8
9
10
11
enemies = [
    {'type': 'Orc', 'health': 0},
    {'type': 'Orc', 'health': 0},
    {'type': 'Orc', 'health': 25},
    {'type': 'Orc', 'health': 0},
]

if any([enemy['health'] for enemy in enemies]):
    print('the battle is not over yet.')
else:
    print('No more enemies remain')

위의 코드는 battle game 의 상황을 가정하고 피가 1 이상인 몬스터가 한 마리라도 있다면 “The battle is not over yet” 이라는 문장을, 한 마리도 없다면 “No more enemies remain’ 이라는 문장을 출력하는 예제이다.

생각해보면, 시간이 촉박한 상황에서 알고리즘 문제를 풀 때 iterative 한 데이터 내의 element 중 하나라도 어떤 조건을 만족하는지를 확인할 때,
flag 변수를 이용해서 로직을 짠 경우가 있었던 것 같다

(하나 이상의 element 가 조건을 충족한다면, set flag = True)

이를 any() 함수를 이용해서 짜게 된다면, for 문을 사용할 필요 없이 list comprehension 한 번 만으로 굉장히 가독성 있고 깔끔한 코드 작성에 도움이 될 것으로 보인다.

모든 경우에 대해 and 문을 사용하고 싶을 때 ? and()

1
2
3
4
5
6
7
8
9
10
11
enemies = [
  {'type': 'Orc', 'health': 0},
  {'type': 'Orc', 'health': 0},
  {'type': 'Orc', 'health': 0},
  {'type': 'Orc', 'health': 0},
]

if all([enemy['health'] == 0 for enemy in enemies]):
  print('No more enemies remain')
else:
  print('the battle is not over yet.')

위에서 말한 flag 로직으로 한 번 더 설명할 수 있겠다. flag 변수를 사용해서 체크했다면, 단 하나의 조건이라도 조건을 충족하지 않는 경우

set flag = False

를 통해서 조건을 체크하고 로직을 짜겠지만, all() 을 사용하면 별도의 flag 변수를 선언할 필요도 없고 for 문을 작성할 필요 없이 list comprehension 한 번 만으로 체크할 수 있게 되므로 역시 더 깔끔하게 작성할 수 있을 것이다.

소스 출처

What is any() in python?

comments powered by Disqus