두 리스트의 교집합 구하기


발생하는 문제 및 실행환경

리스트가 1차원 배열인 경우는 이렇게 구하는 걸로 알고 있는데

소스코드

b1 = [1,2,3,4,5,9,11,15]
b2 = [4,5,6,7,8]
b3 = [val for val in b1 if val in b2]

#또는

def intersect(a, b):
    return list(set(a) & set(b))
print intersect(b1, b2)

그런데 이렇게 중첩된 리스트는 어떻게 교집합을 구해주나요?

c1 = [1, 6, 7, 10, 13, 28, 32, 41, 58, 63]
c2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]

제가 원하는 교집합 결과는 [[13,32],[7,13,28],[1,6]]입니다.

  • 2016년 01월 27일에 작성됨

조회수 434


1 답변


좋아요
0
싫어요
채택취소하기

1차원 리스트 - 추가

1차원 리스트의 교집합에서 파이썬 내장함수 set.intersection()를 쓸 수도 있습니다. 다만 이 함수는 set타입에서 쓸 수 있어 list의 교집합을 구할 때는 list를 set으로 변환해 set.intersection한 뒤, 그 결과를 다시 list로 변환해야 합니다.

b1 = [1,2,3,4,5,9,11,15]
b2 = [4,5,6,7,8]
b3 = list(set(b1).intersection(b2))

그리고 중첩된 리스트에 대해서는 다음 2가지 방법을 쓸 수 있습니다.

중첩된 리스트

filter와 lambda를 쓰는 경우

c3 = [filter(lambda x: x in c1, sublist) for sublist in c2]

코드를 설명하면, (...) for sublist in c2가 외부 리스트의 아이템(원소로 있는 리스트)을 각각 순회하고 filter()가 이 내부 리스트의 아이템(정수)을 순회하면서 이 아이템이 c1에 있는지 확인합니다.

혹 lambda에 익숙하지 않으면 다음 방법을 써주세요

set.intersection()을 쓰는 경우

c3 = [ list(set(c1).intersection(i)) for i in c2]
  • 2016년 01월 27일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close