2014-04-24 2 views
2

나는 "259136 keys"의 사전을 가지고 있으며, 각각의 키는 1 개 이상의 값을 가지고 있습니다.사전의 모든 키 사이의 공통 항목

내 목표는 "키 목록에서 다른 키와 공통된 값이 하나 이상있는 키를 찾으려면?"입니다.

이 문제를 해결하기 위해 여러 가지 방법을 시도했지만 더 빠른 해결책을 찾고있었습니다. 그래서 지금은 값이 키가되고,이 방법은 내가 두 개의 사전 및 I있을 것이다, 위의 조건

  • 값 키에 키 값에서 사전을 반전을 확인하기 위해 259,135 키와 비교 각 키에 대한

    1. 시도 첫 번째 값으로 이동하여 첫 번째 값의 값을 기반으로 두 번째 값의 값을 모두 가져올 수 있습니다.
  • +0

    결과는 무엇입니까? – ooga

    +4

    사전에있는 하나의 키가 둘 이상의 값을 가질 수 있습니까? 아니면 하나 이상의 값을 포함 할 수있는 사전 값 목록 (튜플, 세트, ​​컨테이너)입니까? – Hyperboreus

    +3

    어떤 키에 키 값이 있는지 알고있는 것이 중요합니까? –

    답변

    2

    세트의 DICT 사용 : 당신은 공통점이 하나 이상의 키를 가지고있는 사람을 원하는 경우 다음

    d={ 'k1': [1,2,3], 
         'k2': [2], 
         'k3': [10], 
         'k4': [3,2] 
        } 
    
    com_keys={} 
    for k, v in d.items(): 
        for e in v: 
         com_keys.setdefault(e, set()).add(k)  
    
    print com_keys 
    # {1: set(['k1']), 10: set(['k3']), 3: set(['k1', 'k4']), 2: set(['k2', 'k1', 'k4'])} 
    

    을 그냥 DICT 이해 (이상 비단뱀에 대한 등)으로 필터링 :

    >>> {k:v for k,v in com_keys.items() if len(v)>1 } 
    {2: set(['k2', 'k1', 'k4']), 3: set(['k1', 'k4'])} 
    

    이 얻을 작은 당신의 DICT 중 하나가 할 '단일 항목'으로 반복 (리스트, 튜플, 등)을 지원하는 컨테이너의 비 균일 조합 인 경우 더 도전 for 루프 (문자열, 유니 코드, 다른 dicts 등)로 반복하지 않으려는 반복 (ints, floats) 또는 지원하지 않는 항목

    예를 들어 목록과 '단일 항목' 정수 및 문자열 :

    import collections 
    
    d={ 'k1': [1,2,3], 
         'k2': 2, 
         'k3': [10], 
         'k4': [3,2], 
         'k5': 'string', 
         'k6': ['string',2] 
        } 
    
    com_keys={} 
    for k, v in d.items(): 
        if not isinstance(v, basestring) and isinstance(v, collections.Iterable): 
         for e in v: 
          com_keys.setdefault(e, set()).add(k)  
        else:   
         com_keys.setdefault(v, set()).add(k) 
    
    print com_keys 
    # {1: set(['k1']), 10: set(['k3']), 3: set(['k1', 'k4']), 2: set(['k2', 'k1', 'k6', 'k4']), 'string': set(['k6', 'k5'])} 
    print {k:v for k,v in com_keys.items() if len(v)>1 } 
    # {2: set(['k2', 'k1', 'k6', 'k4']), 3: set(['k1', 'k4']), 'string': set(['k6', 'k5'])} 
    
    +0

    감사합니다. – mparida