2013-12-14 2 views
1

저는 중첩뿐만 아니라 파이썬 사전에 익숙하지 않습니다.파이썬 : 중첩 된 사전에서 일치하는 값을 찾으십시오.

다음은 내가 찾고자하는 것입니다. 모든 객체의 색상과 높이가 같은 객체가 있습니다. 나는 모든 속성을 비교하고 일치하는 모든 속성의 목록을 만들어야합니다.

matchList = [] 
dict = {obj1:{'color': (1,0,0), 'height': 10.6}, 
     obj2:{'color': (1,0.5,0), 'height': 5}, 
     obj3:{'color': (1,0.5,0), 'height': 5}, 
     obj4:{'color': (1,0,0), 'height': 10.6}} 

나는 서로에 OBJS의 각을 비교하여 일치하는 모든 것들의 중첩 된 목록을 만들 수있는 방법을 찾을 필요가있다.

matchList = [[obj1, obj4], [obj2, obj3]] 

가 어떻게 이렇게 가겠어요 : OBJ1 및 OBJ4 일치와 obj2보다 & 3 일치, 내가 원한다면이 내 결과는?

답변

1

dict가 내장 된 파이썬 사전 클래스, 당신이 그렇게를 말합니다

그 주위에 가장 간단한 방법은 키 - 값 튜플 튜플처럼 불변 해쉬 무언가에 각 dict를 변환하는 것입니다 그것을 무시하지 않는 것이 좋습니다.

나는 다음 예에서 objs에 사전 이름을 변경했습니다

import itertools as it 
keys = sorted(objs.keys(), key=lambda k: objs[k]) # Make sure `objs` with the same value be arranged next to each other 
groups = it.groupby(keys, lambda k: d[k]) # so that we can group them by value 
match_list = [list(keys) for v, keys in groups] 
1

당신이하려는 것은 등가 클래스 값을 만드는 것입니다.

일반적으로, 이것은 간단하다

: 단지 multidict에 딕셔너리 후, 각 세트 또는 값의 목록에 상응하는 클래스이다 (그 값 세트는 0 이상의 실제 값리스트되는 딕셔너리)를 역방향
original_dict = {'a': 1, 'b': 2, 'c': 1, 'd': 2} 

from collections import defaultdict 
reverse_multidict = defaultdict(list) 
for key, value in original_dict.items(): 
    reverse_multidict[value].append(key) 

matchList = list(reverse_multidict.values()) # leave out the list() in 2.x 

그러나 귀하의 경우 값은 dict입니다. 즉 dict에서 키로 사용할 수 없습니다.

for key, value in original_dict.items(): 
    reverse_multidict[tuple(value.items())].append(key) 
관련 문제