HOWTO · Python

Python 사전 교차점

이 기사에서는 새 사전을 쉽고 효율적으로 만들기 위해 Python에서 두 개의 사전 또는 여러 사전에서 교차를 수행하는 다양한 방법에 대해 설명합니다.

이 페이지의 내용

파이썬에는 사전 교집합을 구하는 단일 내장 연산이 없습니다. 공통 키가 필요한지, 키와 값이 모두 같은 항목이 필요한지, 아니면 값을 선택하거나 결합해 새 매핑을 만들고 싶은지에 따라 방법을 선택하세요.

사전 교집합이란 무엇인가요?

사전은 고유하고 해시 가능한 키를 값에 대응시킵니다. 값에는 리스트처럼 변경 가능하거나 해시할 수 없는 객체를 비롯해 모든 파이썬 객체를 사용할 수 있습니다. ‘사전의 교집합’은 각 매핑에 있는 공통 키만 남기거나, 키와 값이 모두 일치하는 쌍만 남기거나, 공통 키로 새 사전을 만드는 것을 뜻할 수 있습니다. 결과가 서로 다르므로 코드를 고르기 전에 필요한 결과부터 정하세요.

공통 키를 기준으로 사전 교집합 구하기

딕셔너리 컴프리헨션을 사용하면 첫 번째 사전의 키 중 두 번째 사전에도 있는 키만 남길 수 있습니다. 이 패턴은 기본적으로 첫 번째 사전의 값을 사용합니다. 다음 예제는 필요한 입력이 모두 포함된 정상 동작 사례입니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

first = {"name": "Ada", "team": "blue", "level": 3}
second = {"team": "green", "level": 4, "active": True}

shared = {key: first[key] for key in first if key in second}
print(shared)

결과에는 team과 level이 들어가며, 값은 first에서 가져옵니다. 사전의 삽입 순서는 first를 순회하는 순서를 따르므로 선택된 항목도 그 순서대로 유지됩니다. 두 번째 사전의 값을 사용하려면 식에서 second[key]를 쓰세요. 두 값을 결합하려면 애플리케이션에 알맞은 튜플, 리스트 또는 다른 값으로 식을 작성하면 됩니다.

예를 들어 다음 패턴은 두 사전의 문자열 값을 이어 붙입니다.

first = {1: "My", 2: "I", 3: "age"}
second = {1: "name", 2: "live", 4: "year"}

joined = {key: first[key] + " " + second[key] for key in first if key in second}
print(joined)

문법에 관한 자세한 내용은 딕셔너리 컴프리헨션을 참고하세요.

키와 값이 모두 일치하는 항목으로 사전 교집합 구하기

키와 값이 두 사전에 함께 똑같이 들어 있는 경우에만 쌍을 결과에 포함하려면 dict.items()를 사용하세요. 키와 값이 모두 해시 가능하면 사전의 items() 뷰에 집합 연산을 적용할 수 있습니다. 특히 리스트 값은 이 집합 연산의 원소가 될 수 없습니다. 여기서 & 연산자는 두 항목 뷰에 적용되며, 사전 연산자는 아닙니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

first = {"A": 1, "B": 6, "C": 3, "D": 5}
second = {"A": 1, "C": 4, "D": 5, "E": 2}

matching_pairs = dict(first.items() & second.items())
print(matching_pairs)

이 연산은 ("A", 1)과 ("D", 5) 같은 쌍을 남깁니다. 두 번째 사전에서 "C"에 다른 값이 연결되어 있으므로 ("C", 3)은 제외됩니다. 키만 중요하다면 키 뷰끼리 교집합을 구하세요. 이 연산의 결과는 사전이 아니라 집합입니다.

first = {"A": 1, "B": 6, "C": 3}
second = {"A": 9, "C": 4, "D": 2}

shared_keys = first.keys() & second.keys()
print(shared_keys)

다음 단계에서 매핑이 필요하다면 shared_keys를 순회하는 컴프리헨션을 사용하고, 각 값을 어느 사전에서 가져올지 명시적으로 선택하세요.

여러 사전의 교집합 구하기

사전이 세 개 이상이면 모든 사전에 존재하는 키를 찾도록 키 뷰끼리 교집합을 구하세요. 그런 다음 원하는 원본 사전의 값으로 결과를 만듭니다. 이는 값도 모두 일치해야 하는 키-값 쌍 교집합과는 다릅니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

first = {"A": 1, "B": 6, "C": 3, "D": 5}
second = {"A": 1, "C": 4, "D": 5, "E": 2}
third = {"A": 8, "C": 3, "D": 5, "E": 1}

shared_keys = first.keys() & second.keys() & third.keys()
from_first = {key: first[key] for key in shared_keys}
matching_pairs = dict(first.items() & second.items() & third.items())
print(from_first)
print(matching_pairs)

from_first에는 세 사전에 공통으로 있는 모든 키가 들어가며, 값은 first에서 가져옵니다. matching_pairs에는 세 사전에 모두 똑같이 들어 있는 쌍만 포함됩니다. 여러 사전을 시퀀스에 담아 두었다면 키 연산에 set.intersection()을 사용할 수 있습니다. 각 사전의 키를 집합 인수로 전달하고, 사전 결과가 필요하면 컴프리헨션을 추가하세요. 두 집합 연산과 & 형식은 모두 해시 가능한 키에 적용됩니다. 항목 쌍의 교집합에서는 값도 해시 가능해야 합니다.

적절한 교집합 방법 선택하기

  • 공통 키로 새 사전을 만들고 값을 선택하거나 결합하려면 key in other를 사용하는 컴프리헨션을 쓰세요.
  • 키와 값이 모두 완전히 같은 쌍이 필요하면 dict.items()에 집합 교집합을 적용하세요. 쌍의 두 요소 모두 해시 가능해야 합니다.
  • 공통 키만 필요하면 set.intersection() 또는 키 뷰 교집합을 사용하세요. 결과는 집합이므로 필요하다면 별도로 사전을 만드세요.

이 패턴은 결과가 무엇을 뜻하는지 명확하게 보여 주며, 사전 두 개 이상에도 적용할 수 있습니다. 보존하려는 데이터를 기준으로 연산을 고른 다음, 새 사전의 값을 어느 매핑에서 가져올지 정하세요.