데이터 처리 작업을 하다 보면 리스트에 포함된 요소의 개수를 세어야 하는 경우가 자주 발생합니다. 그런데 리스트 안에 또 다른 리스트가 중첩되어 있으면 단순히 len() 함수만으로는 정확한 개수를 구하기 어렵습니다. 이 글에서는 중첩 리스트까지 고려하여 리스트 내 모든 요소의 개수를 효과적으로 세는 다양한 방법을 소개합니다.
1. For 루프와 리스트 컴프리헨션 활용
이 방법은 두 개의 for 루프를 사용해 리스트의 중첩 구조를 순회합니다. 아래 예제에서는 내부 요소의 개수가 서로 다른 중첩 리스트를 다루며, 리스트 컴프리헨션으로 리스트를 평탄화(flatten)한 뒤 len() 함수를 적용해 전체 요소 개수를 계산합니다.
예제 코드
listA = [[2,9, 6], [5, 'a'], [0], [12,'c', 9, 3]]
# 주어진 리스트
print("Given list : ",listA)
res = len([x for y in listA for x in y])
# 결과 출력
print("Total count of elements : " ,res)실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Given list : [[2, 9, 6], [5, 'a'], [0], [12, 'c', 9, 3]] Total count of elements : 10
2. itertools.chain 활용
이 방법은 표준 라이브러리인 itertools 모듈의 chain 메서드를 활용합니다. chain(*listA)는 중첩 리스트의 모든 내부 요소를 꺼내어 하나의 시퀀스로 평탄화하며, 이를 list()로 변환한 후 len() 함수를 적용하면 최종 요소 개수를 구할 수 있습니다.
예제 코드
from itertools import chain
listA = [[2,9, 6], [5, 'a'], [0], [12,'c', 9, 3]]
# 주어진 리스트
print("Given list : ",listA)
res = len(list(chain(*listA)))
# 결과 출력
print("Total count of elements : " ,res)실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Given list : [[2, 9, 6], [5, 'a'], [0], [12, 'c', 9, 3]] Total count of elements : 10
어떤 방법을 선택해야 할까?
두 방법 모두 동일한 결과를 반환하지만 상황에 따라 선택 기준이 달라질 수 있습니다. 리스트 컴프리헨션은 별도의 임포트 없이 간결하게 사용할 수 있고, chain은 대용량 데이터를 다룰 때 제너레이터 기반으로 동작해 메모리 효율성이 더 좋습니다. 참고로 중첩 깊이가 한 단계인 경우에는 sum(len(sub) for sub in listA)처럼 각 하위 리스트의 길이를 합산하는 방법도 유용합니다.