두 리스트의 교집합 구하기

발생하는 문제 및 실행환경

리스트가 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]]입니다.

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]
    

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.