[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.누락 된 키에 대해 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.당신은 삼중 중첩 된 사전으로 사전을 재구성 할 수 있습니다.
당신은 삼중 중첩 된 사전으로 사전을 재구성 할 수 있습니다.
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.다른 방법이있을 수 있지만 단일 검색 만하면됩니다 (반복 검색을 위해 더 나은 데이터 구조를 만드는 방법이있을 수 있습니다). (이는 여러 개의 가능한 위치에서 '*'가있는 임의의 길이가있는 튜플을 처리합니다)
다른 방법이있을 수 있지만 단일 검색 만하면됩니다 (반복 검색을 위해 더 나은 데이터 구조를 만드는 방법이있을 수 있습니다). (이는 여러 개의 가능한 위치에서 '*'가있는 임의의 길이가있는 튜플을 처리합니다)
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.@ 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]
from https://stackoverflow.com/questions/18893624/partial-match-dictionary-keyof-tuples-in-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] DateTimeField가 관리 시스템에 표시되지 않습니다. (0) | 2018.11.26 |
---|---|
[PYTHON] Pandas 데이터 프레임의 무작위 행 선택 (0) | 2018.11.26 |
[PYTHON] 프로세스간에 클래스를 공유하려면 어떻게해야합니까? (0) | 2018.11.26 |
[PYTHON] 팬더 데이터 프레임의 음수를 0으로 대체하는 방법 (0) | 2018.11.26 |
[PYTHON] SciPy를 사용한 베 지어 커브 피팅 (0) | 2018.11.26 |