복붙노트

[PYTHON] 파이썬의 부분 일치 사전 키 (튜플 중)

PYTHON

파이썬의 부분 일치 사전 키 (튜플 중)

키 튜플에 공통 요소가있는 3tuple을 3tuple로 매핑하는 사전이 있습니다.

dict= { (a,b,c):(1,2,3),
        (a,b,d):tuple1,
        (a,e,b):tuple,
        .
        (f,g,h):tuple3,
        .
        .
        .
        tuple:tuple
      }

이제 사전 (즉, 1 : 2 : 3)과 tuple1 (a, b, anyX)에 일치하는 값을 어떻게 찾을 수 있습니까?

이것은 컴퓨터 생성 및 매우 큰 따라서 어떤 X를 결정하기 위해 노력이 소요됩니다.

그래서, 내가 할 수있는 좋은 방법이 있니?

편집 : (f, g, *), (f, *, g)와 tuple3의 부분 매칭도 도움이되지만 꼭 필요한 것은 아닙니다.

해결법

  1. ==============================

    1.누락 된 키에 대해 None을 전달하면 all 및 zip을 사용할 수 있습니다.

    누락 된 키에 대해 None을 전달하면 all 및 zip을 사용할 수 있습니다.

    >>> from itertools import permutations
    >>> import random
    #create a sample dict
    >>> dic = {k:random.randint(1, 1000) for k in permutations('abcde', 3)}
    def partial_match(key, d):
        for k, v in d.iteritems():
            if all(k1 == k2 or k2 is None  for k1, k2 in zip(k, key)):
                yield v
    ...         
    >>> list(partial_match(('a', 'b', None), dic))
    [541, 470, 734]
    >>> list(partial_match(('a', None, 'b'), dic))
    [460, 966, 45]
    #Answer check
    >>> [dic[('a', 'b', x)] for x in 'cde']
    [541, 734, 470]
    >>> [dic[('a', x, 'b')] for x in 'cde']
    [966, 460, 45]
    
  2. ==============================

    2.당신은 삼중 중첩 된 사전으로 사전을 재구성 할 수 있습니다.

    당신은 삼중 중첩 된 사전으로 사전을 재구성 할 수 있습니다.

    dict= { ("foo", 4 , "q"): 9,
            ("foo", 4 , "r"): 8,
            ("foo", 8 , "s"): 7,
            ("bar", 15, "t"): 6,
            ("bar", 16, "u"): 5,
            ("baz", 23, "v"): 4
          }
    
    d = {}
    for (a,b,c), value in dict.iteritems():
        if a not in d:
            d[a] = {}
        if b not in d[a]:
            d[a][b] = {}
        d[a][b][c] = value
    

    여기서 d는 다음과 같습니다.

    d = {
        "foo": {
            4:{
                "q": 9,
                "r": 8
            },
            8:{
                "s": 7
            }
        },
        "bar":{
            15:{
                "t": 6
            }
            16:{
                "u": 5
            }
        },
        "baz":{
            23{
                "v": 4
            }
        }
    }
    

    이제 첫 번째와 두 번째가 가능한 3 번째 키를 쉽게 반복 할 수 있습니다.

    #find all keys whose first two elements are "foo" and 4
    a = "foo"
    b = 4
    for c in d[a][b].iterkeys():
        print c
    

    결과:

    q
    r
    

    이것은 세 번째 키와 일치하는 경우에만 작동합니다. 예를 들어 세 번째와 첫 번째 키가 모두 주어지면 두 번째 키를 모두 찾을 수 없습니다.

  3. ==============================

    3.다른 방법이있을 수 있지만 단일 검색 만하면됩니다 (반복 검색을 위해 더 나은 데이터 구조를 만드는 방법이있을 수 있습니다). (이는 여러 개의 가능한 위치에서 '*'가있는 임의의 길이가있는 튜플을 처리합니다)

    다른 방법이있을 수 있지만 단일 검색 만하면됩니다 (반복 검색을 위해 더 나은 데이터 구조를 만드는 방법이있을 수 있습니다). (이는 여러 개의 가능한 위치에서 '*'가있는 임의의 길이가있는 튜플을 처리합니다)

    def match(tup,target):
       if len(tup) != len(target):
          return False
       for i in xrange(len(tup)):
          if target[i] != "*" and tup[i] != target[i]:
             return False
       return True
    
    def get_tuples(mydict,target):
       keys = filter(lambda x: match(x,target),mydict.keys())
       return [mydict[key] for key in keys]
    
    #example:
    dict= { (1,3,5):(1,2,3),
            (1,3,6):(1,5,7),
            (1,2,5):(1,4,5),
           }
    print get_tuples(dict,(1,3,'*'))
    

    .

  4. ==============================

    4.@ AshwiniChaudhary의 솔루션은 객체 지향 솔루션에 쉽게 적용 할 수 있습니다. dict을 서브 클래스 화하고 메소드를 추가 할 수 있습니다.

    @ AshwiniChaudhary의 솔루션은 객체 지향 솔루션에 쉽게 적용 할 수 있습니다. dict을 서브 클래스 화하고 메소드를 추가 할 수 있습니다.

    class tup_dict(dict):
        def getitems_fromtup(self, key):
            for k, v in self.items():
                if all(k1 == k2 or k2 is None for k1, k2 in zip(k, key)):
                    yield v
    
    d = tup_dict({("foo", 4 , "q"): 9,
                  ("foo", 4 , "r"): 8,
                  ("foo", 8 , "s"): 7,
                  ("bar", 15, "t"): 6,
                  ("bar", 16, "u"): 5,
                  ("baz", 23, "v"): 4})
    
    res = list(d.getitems_fromtup(("foo", 4, None)))  # [9, 8]
    
  5. from https://stackoverflow.com/questions/18893624/partial-match-dictionary-keyof-tuples-in-python by cc-by-sa and MIT license