Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 리스트에서 조건에 맞는 요소 개수 세기: sum, map, reduce 활용 방법

이 글에서는 Python 리스트에서 원하는 조건을 만족하는 요소만 골라내고, 해당 요소가 몇 개인지 그 개수를 구하는 다양한 방법을 소개합니다. 예를 들어 리스트 안에서 'Mon'과 'Wed'처럼 특정 값에 해당하는 항목이 몇 번 등장하는지 확인해야 하는 상황을 생각해 볼 수 있습니다. 조건을 정의하고, 그 조건을 충족하는 요소만 선택하여 개수를 출력하는 것이 핵심입니다.

1. in 연산자와 sum() 함수 사용하기

가장 직관적인 방법은 in 연산자로 조건을 검사하고, sum() 함수로 결과를 집계하는 것입니다. 제너레이터 표현식 내부에서 요소가 조건에 일치하면 1, 일치하지 않으면 0이 반환되며, 이 값들을 모두 더하면 조건을 만족하는 요소의 총 개수를 얻을 수 있습니다.

예제 코드

Alist = ['Mon', 'Wed', 'Mon', 'Tue', 'Thu']
# 주어진 리스트
print("Given list:\n", Alist)
cnt = sum(1 for i in Alist if i in('Mon','Wed'))
print("Number of times the condition is satisfied in the list:\n",cnt)

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Given list:
['Mon', 'Wed', 'Mon', 'Tue', 'Thu']
Number of times the condition is satisfied in the list:
3

'Mon'이 2번, 'Wed'가 1번 등장했으므로 총 3이라는 결과가 나옵니다. 코드가 간결하고 가독성이 높아 실무에서 가장 널리 쓰이는 방식입니다.

2. map()과 lambda 함수 사용하기

두 번째 방법은 map() 함수와 lambda 표현식을 함께 사용하는 것입니다. lambda로 각 요소가 조건에 포함되는지 판별하고, map()이 리스트 전체에 이 판별식을 적용합니다. 마지막으로 sum()으로 True(1)의 개수를 합산하여 최종 카운트를 구합니다.

예제 코드

Alist = ['Mon', 'Wed', 'Mon', 'Tue', 'Thu']
# 주어진 리스트
print("Given list:\n", Alist)
cnt=sum(map(lambda i: i in('Mon','Wed'), Alist))
print("Number of times the condition is satisfied in the list:\n",cnt)

실행 결과

위 코드를 실행하면 동일하게 다음 결과를 얻습니다.

Given list:
['Mon', 'Wed', 'Mon', 'Tue', 'Thu']
Number of times the condition is satisfied in the list:
3

함수형 프로그래밍 스타일을 선호한다면 이 방식이 유용하며, 조건 로직을 lambda 안에 한 줄로 담을 수 있다는 장점이 있습니다.

3. functools.reduce() 사용하기

세 번째 방법은 functools 모듈의 reduce() 함수를 활용하는 것입니다. reduce()는 인수로 전달된 함수를 리스트의 모든 요소에 순차적으로 적용하면서 하나의 누적 결과를 만들어냅니다. 여기서는 누적 변수 count에 각 요소가 조건을 만족할 때마다 1씩 더하도록 작성하여, 최종적으로 조건에 맞는 요소의 개수를 얻습니다.

예제 코드

from functools import reduce
Alist = ['Mon', 'Wed', 'Mon', 'Tue', 'Thu']
# 주어진 리스트
print("Given list:\n", Alist)
cnt = reduce(lambda count, i: count + (i in('Mon','Wed')), Alist, 0)
print("Number of times the condition is satisfied in the list:\n",cnt)

실행 결과

위 코드 역시 같은 결과를 출력합니다.

Given list:
['Mon', 'Wed', 'Mon', 'Tue', 'Thu']
Number of times the condition is satisfied in the list:
3

reduce()의 세 번째 인수인 초기값 0은 빈 리스트가 입력되더라도 오류 없이 0을 반환하도록 보장해 줍니다.

마무리 및 참고 사항

세 가지 방법 모두 동일한 결과를 반환하지만, 상황에 따라 적합한 도구가 다릅니다. 단순한 조건 검사에는 제너레이터 표현식과 sum()의 조합이 가독성 면에서 가장 우수하며, 이미 함수형 스타일로 작성된 코드베이스라면 map()이나 reduce()가 자연스럽게 어울립니다. 또한 조건이 복잡해질 경우 filter()len()을 조합하거나, 대량의 데이터를 다룬다면 NumPy나 pandas와 같은 라이브러리의 벡터화 연산을 고려하는 것이 성능 면에서 유리할 수 있습니다. 자신의 코드 스타일과 데이터 규모에 맞는 방법을 선택해 활용해 보시기 바랍니다.