리스트를 요소로 가지는 리스트(2차원 리스트)가 있을 때, 내부 리스트들의 각 위치(index)별로 특정 문자가 몇 번 나타나는지 확인해야 하는 경우가 있습니다. 아래 예시를 통해 요구 사항을 쉽게 이해할 수 있습니다.
문제 이해하기
다음과 같은 리스트의 리스트가 있다고 가정해 보겠습니다.
listA = [['a', 'a', 'b'], ['a', 'c', 'b'], ['c', 'a', 'b'], ['c', 'a', 'a']]
위 리스트는 각각 3개의 요소를 가진 내부 리스트들로 구성되어 있습니다. 첫 번째 내부 리스트는 위치 0, 1, 2에 각각 'a', 'a', 'b'를 가지고 있고, 세 번째 내부 리스트는 같은 위치에 'c', 'a', 'b'를 가지고 있습니다.
모든 내부 리스트를 기준으로 문자 'a'의 출현 빈도를 세어 보면 다음과 같습니다.
- 위치 0: 2회
- 위치 1: 3회
- 위치 2: 1회
이제 이러한 값을 구하는 두 가지 방법을 살펴보겠습니다.
방법 1: pandas 활용
pandas 라이브러리는 데이터프레임을 생성하여 데이터를 조작하는 데 널리 사용됩니다. 리스트의 리스트를 데이터프레임으로 변환한 후, where 절을 사용해 각 위치에 문자 'a'가 있는지 확인할 수 있습니다.
예제 코드
import pandas as pd
# 주어진 리스트의 리스트
listA = [['a', 'a', 'b'],
['a', 'c', 'b'],
['c', 'a', 'b'],
['c', 'a', 'a']]
# pandas 활용
df = pd.DataFrame(listA)
res = df.where(df == 'a', 0).where(df != 'a', 1)
# 결과 출력
print("'a'의 위치 0, 1, 2별 출현 횟수\n", res.sum())실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
'a'의 위치 0, 1, 2별 출현 횟수 0 2.0 1 3.0 2 1.0
데이터프레임에서 'a'인 값은 1로, 그렇지 않은 값은 0으로 변환한 뒤 열(column) 단위로 합계를 구하면 각 위치별 빈도를 얻을 수 있습니다.
방법 2: zip 함수 활용
zip(*listA)를 사용하면 내부 리스트들을 전치(transpose)하여 같은 위치의 요소들을 묶을 수 있습니다. 이후 각 튜플에서 count() 메서드로 'a'의 개수를 세면 됩니다.
예제 코드
# 주어진 리스트의 리스트
listA = [['a', 'a', 'b'],
['a', 'c', 'b'],
['c', 'a', 'b'],
['c', 'a', 'a']]
res = [elem.count('a') for elem in zip(*listA)]
# 결과 출력
print("'a'의 위치 0, 1, 2별 출현 횟수\n", res)실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
'a'의 위치 0, 1, 2별 출현 횟수 [2, 3, 1]
마무리
pandas를 사용하면 데이터 분석 워크플로우에서 직관적으로 처리할 수 있고, zip 함수를 사용하는 방법은 외부 라이브러리 없이 순수 파이썬만으로 간결하게 해결할 수 있다는 장점이 있습니다. 상황에 맞는 방법을 선택하여 활용하시기 바랍니다.