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

Python 중첩 리스트에서 공통 요소 찾는 방법 – map, set, reduce 활용

Python에서는 리스트의 내부 요소가 다시 리스트로 구성된 중첩 리스트(nested list) 구조를 자주 다루게 됩니다. 이런 경우 여러 개의 내부 리스트 사이에서 공통으로 존재하는 요소를 추출해야 할 때가 있습니다. 이 글에서는 그러한 공통 요소를 효율적으로 찾는 대표적인 두 가지 방법을 소개합니다.

방법 1: map과 set.intersection 활용하기

교집합(intersection)은 서로 다른 집합들 사이의 공통 요소를 구하는 기본적인 수학 개념입니다. Python의 set.intersection() 메서드는 둘 이상의 집합에 포함된 공통 요소만 담은 집합을 반환합니다.

따라서 먼저 map() 함수를 사용해 내부 리스트들을 모두 집합(set)으로 변환한 뒤, 변환된 집합들에 교집합 연산을 적용하면 됩니다.

예제 코드

listA = [['Mon', 3, 'Tue', 7,'Wed',4],['Thu', 5,'Fri',11,'Tue', 7],['Wed', 9, 'Tue', 7,'Wed',6]]

# 주어진 리스트
print("주어진 리스트 : \n",listA)

# 교집합 적용
res = list(set.intersection(*map(set, listA)))

# 결과 출력
print("내부 리스트들의 공통 요소 : ",res)

실행 결과

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

주어진 리스트 :
[['Mon', 3, 'Tue', 7, 'Wed', 4], ['Thu', 5, 'Fri', 11, 'Tue', 7], ['Wed', 9, 'Tue', 7, 'Wed', 6]]
내부 리스트들의 공통 요소 :  ['Tue', 7]

방법 2: reduce와 lambda 활용하기

functools 모듈의 reduce() 함수를 사용하는 방법도 있습니다. reduce()는 인자로 전달받은 함수를 시퀀스의 모든 요소에 누적적으로 적용하여 하나의 결과값을 만들어냅니다.

여기서는 lambda 함수가 집합으로 변환된 각 내부 리스트를 순회하면서 &(교집합) 연산을 수행함으로써 공통 요소를 찾아냅니다.

예제 코드

from functools import reduce
listA = [['Mon', 3, 'Tue', 7,'Wed',4],['Thu', 5,'Fri',11,'Tue', 7],['Wed', 9, 'Tue', 7,'Wed',6]]

# 주어진 리스트
print("주어진 리스트 : \n",listA)

# reduce 적용
res = list(reduce(lambda i, j: i & j, (set(n) for n in listA)))

# 결과 출력
print("내부 리스트들의 공통 요소 : ",res)

실행 결과

위 코드를 실행하면 첫 번째 방법과 동일한 결과를 얻을 수 있습니다.

주어진 리스트 :
[['Mon', 3, 'Tue', 7, 'Wed', 4], ['Thu', 5, 'Fri', 11, 'Tue', 7], ['Wed', 9, 'Tue', 7, 'Wed', 6]]
내부 리스트들의 공통 요소 :  ['Tue', 7]

정리

두 방법 모두 동일한 결과를 반환하지만 상황에 따라 선택 기준이 달라질 수 있습니다.

  • map + set.intersection: 가독성이 좋고 직관적이며, 여러 집합을 한 번에 비교할 때 유용합니다.
  • reduce + lambda: 함수형 프로그래밍 스타일에 익숙하거나, 누적 연산 흐름을 명확히 표현하고 싶을 때 적합합니다.

중첩 리스트에서 공통 요소를 찾아야 하는 데이터 처리 작업이라면, 위 두 가지 접근 방식을 상황에 맞게 활용해 보시기 바랍니다.