2017-12-01 3 views
4

dict1의 키가 dict2에 몇 번 있는지 확인하려면 어떻게해야합니까? dict1의 키가 dict2에있는 경우 키가 발견 된 횟수를 기준으로 초기 값이 4 인 변수 val을 빼야합니다. dicts간에 두 반복 키, val2 같아야 있기 때문에이파이썬에서 사전간에 키가 반복되는 횟수를 계산합니다.

print dict1 
{(2, 0): 3, (3, 1): 0, (1, 1): 2, (2, 2): 1} 

dict2

print `dict2` 
{(2, 0): 323, (3, 1): 32, (10, 10): 21, (20, 2): 100} 

보이는 것처럼 예 dict1 들어

보인다.

dict1과 동일하게 보이는 경우 val0이어야합니다.

또한 dict1은 항상 같은 크기이지만 dict2은 상당히 커질 수 있으므로 빠른 검색 방법이 이상적입니다. 마지막으로, 여기서 말하는 dict의 가치는 실제로 의미가 없습니다.

+1

''목록을 작성하는 이유 @alfasin – alfasin

+0

그냥 얻을 수 ([dict2에서 k는 경우 dict1에서 k에 대한 K]) 렌의 길이? 'sum (dict2에서 k의 경우 dict1의 k에 대해 1)'이 더 효율적입니다. 그러나이 작업 세트 교차점이 더 빠릅니다. –

+0

@ PM2Ring ha, 좋은 점 :) – alfasin

답변

4

세트 교차 사용 :

d1 = {(2, 0): 3, (3, 1): 0, (1, 1): 2, (2, 2): 1} 
d2 = {(2, 0): 323, (3, 1): 32, (10, 10): 21, (20, 2): 100} 

sd1 = set(d1.keys()) 
sd2 = set(d2.keys()) 
len(sd1.intersection(sd2)) 

편집 : 키 뷰가 이미 있기 때문에 설정 같은, 당신이 직접 d1.keys() & d2.keys()을 할 수 있습니다. .keys()은 기존 dict 구조 (주석의 @ PM2RING에 대한 크레딧)에 대한 대체 인터페이스를 제공하기 때문에 매우 저렴한 호출이라는 점에 유의하십시오.

+1

키보기가 이미 설정되어 있으므로'd1.keys() & d2.keys() '를 수행 할 수 있습니다. –

+1

'.keys()'는 매우 저렴한 호출이므로 단지 기존의 dict 구조에 대한 대체 인터페이스를 제공합니다. –

0

각 dict의 키 목록에서 세트를 만듭니다. 해당 집합의 교차 및 합집합을 찾습니다. union - intersection은 차이점을 제공합니다. 이것이 0이면 0을 반환합니다. 그렇지 않은 경우 교차점의 크기를 반환합니다. dict_keys는 already set-like 때문에

4

, 당신은 단순히 파이썬 2에서 파이썬 3입니다

len(dict1.keys() & dict2.keys()) 

를 사용할 수에 해당하는 뷰 객체는 유사하게 사용하십시오 dict.viewkeys()이다.

len(dict1.viewkeys() & dict2.viewkeys()) 
0

이 파이썬 2에서 작동하며 3 : len(set(dict1).intersection(dict2))

In [1]: dict1 = {(2, 0): 3, (3, 1): 0, (1, 1): 2, (2, 2): 1} 

In [2]: dict2 = {(2, 0): 323, (3, 1): 32, (10, 10): 21, (20, 2): 100} 

In [3]: len(set(dict1).intersection(dict2)) 
Out[3]: 2 
관련 문제