2014-12-08 1 views
-2

나는 사전의 사전을 가지고있다. 중첩 된 dict 중 하나에 고유 한 키만 병합 된 dict에 존재하도록 모든 중복 키를 제거해야합니다. 중첩 딕셔너리를 평평하게하거나 제외하는 방법 중복 키는

for key, value in lst1.iteritems(): 
    for key1, value1 in value.iteritems(): 
     if key1 <> "b": 
     lst2[key1]=value1 

내가 이전 답변 here, herehere의 일부를 시도했지만 잘 동작하지 않습니다 수 :

{"a": "x", "c": "z"} 

간단한 코드는 다음과 같습니다 위의 DICT이 될 것이다.

아래의 코드는 오류를 반환합니다 : I로 제대로 나는 구조를 평평 어떻게

{'a': 'b', 'c': 'b'} 

:

lst2 = dict((key1, value1) for key1, value1 in (value for key, value in lst1.items())) 

반환 : 값이

lst2 = {key1: value1 for key1, value1 in value for key, value in lst1.items()} 

이 하나가 정의되어 있지 설명 했니?

답변

1

중복 된 키를 제거하기 위해 병합 된 구조에 이미 추가 된 키를 추적해야하므로 단일 이해로는 불가능할 수도 있습니다. for 루프에서 병합 된 구조를 만드는 솔루션은 여전히 ​​간단합니다. 하위 명령의 항목을 출력에 추가하거나 키가 다시 발견되면 삭제하십시오.

data = {1: {'a': 'x', 'b': 'y'}, 2: {'b': 'y', 'c': 'z'}} 
out = {} 

for sub in data.values(): 
    for key, value in sub.items(): 
     if key in out: 
      del out[key] 
     else: 
      out[key] = value 

print(out) # {'a': 'x', 'c': 'z'} 

는 또한이 함축하고 Counter를 사용 할 수 있습니다. 먼저 각 하위 키가 나타나는 횟수를 추적 한 다음 키를 단일 발생으로 만 병합합니다.

from collections import Counter 

data = {1: {'a': 'x', 'b': 'y'}, 2: {'b': 'y', 'c': 'z'}} 

c = Counter(key for sub in data.values() for key in sub) 
out = {key: value for sub in data.values() for key, value in sub.items() if c[key] == 1} 

print(out) # {'a': 'x', 'c': 'z'} 
+0

간단 할 것입니다! 코딩의 다른 pythonic 방법? !!! – msc87

+0

글쎄, 네 말이 맞아. 나는 그것이 독해력 이해를 사용하여 할 수 있는지 궁금 해서요. 첫번째 시력에 나는 그것이 가능하다라고 생각했다. 그러나 거의 시간 이후 나는 포기하지 않았고, 여기에 게시했다. .. 어떤 이익이라도, 어떻게해서든지! – msc87

+0

문제는 두 번째 이해입니다. .values를 사용할 때 오류를 반환합니다. 그렇지 않으면 이미 두 개의 dicts 값을 교차하여 중복을 추출한만큼 두 번째 이해력으로 충분합니다. – msc87