두 리스트의 교집합 구하기
조회수 24024회
발생하는 문제 및 실행환경
리스트가 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 답변
-
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]
댓글 입력