2013-04-09 3 views
1

나는 이전 게시물을 검색하고 사람 묻는 내가 할 노력하고있어 매우 일을 하나 발견되지 않은 : 나는 두 개의 사전을 보면 키가 동일한 경우 인스턴스를 찾기 위해 노력하고파이썬에서 두 개의 서로 다른 사전의 값을 비교합니까?

을 그러나 값은 다릅니다. 사전은 이 아니며 같은 크기입니다. 다른 값을 가진 일치하는 키를 찾았 으면 더 이상 값을 필요로하지 않으므로 목록에 키만 추가하려고합니다.

지금 당장이 작업을 수행하고 있습니다. 그것은 끔찍하게 비효율적이지만 200-ish 항목에는 괜찮습니다. 그래도, 20 만 개 항목을 통해 몇 가지 사전을 가지고, 그것은이 큰 문제가되고있는 곳입니다 : 모든이 할 수있는 방법이 있나요

for sourceKey, sourceValue in sourceDict.iteritems(): 
     for targetKey, targetValue in targetDict.iteritems(): 
       if targetKey == sourceKey: 
        if targetValue != sourceValue: 
         diffList.append(sourceKey) 

? 파이썬 2.6을 사용하고 있습니다. DSM 그의 (지금 삭제) 대답에 언급 한 바와 같이

답변

3
for key in set(sourceDict).intersection(targetDict): 
    # Now we have only keys that occur in both dicts 
    if sourceDict[key] != targetDict[key]: 
     diffList.append(key) 

, 당신은 지능형리스트 또는 발전기와 함께이 작업을 수행 할 수 있습니다

(k for k in set(sourceDict).intersection(targetDict) if sourceDict[key] != targetDict[key]) 
+0

Hmmph. 7 초 만에 나를 때려! 나는 당신이'.keys()'를 호출 할 필요가 없다고 생각하지만, 불필요한 중간 목록을 생성 할 것이다. @DSM은 – DSM

+0

입니다. 나는 어쨌든 그들이 친족이되어 있기 때문에 dict의 키를 세트처럼 다루기위한 오리 - 타이핑 메카니즘이 없다는 것에 조금 놀랐습니다. – kojiro

+1

사실,'.keys()'를 호출하면'dict_keys()'객체가 생기고'a.keys() & b'는 그것이 생각하는대로 동작합니다! [우리는 여기서 2.6으로 작업하고 있습니다. 재미가 없습니다.] – DSM

0
[k for k in source_dict if target_dict.get(k, object()) != source_dict[k]] 
+0

'! ='이 아니어야합니까? – kojiro

+0

@kojiro 옙 죄송합니다. – jamylak

0

1 - 라이너 : [key for key in set(sourceDict).intersection(targetDict) if sourceDict[key] != targetDict[key]]

관련 문제