Nice programing

Python 사전의 하위 집합 가져 오기

nicepro 2020. 12. 8. 20:00
반응형

Python 사전의 하위 집합 가져 오기


사전이 있습니다.

{'key1':1, 'key2':2, 'key3':3}

해당 사전의 하위 집합을 타사 코드에 전달해야합니다. 키를 포함하는 사전 만 원하고 ['key1', 'key2', 'key99']다른 키 (예 'key3':)를 얻으면 엉망으로 폭발합니다. 문제의 코드는 내 통제를 벗어 났으므로 사전을 정리해야하는 위치에 있습니다.

사전을 키 세트로 제한하는 가장 좋은 방법은 무엇입니까?

위의 예제 사전과 허용 된 키가 주어지면 다음을 원합니다.

{'key1':1, 'key2':2}

In [38]: adict={'key1':1, 'key2':2, 'key3':3}
In [41]: dict((k,adict[k]) for k in ('key1','key2','key99') if k in adict)
Out[41]: {'key1': 1, 'key2': 2}

Python3 (또는 Python2.7 이상)에서는 dict-comprehension으로수행 할 수 있습니다.

>>> {k:adict[k] for k in ('key1','key2','key99') if k in adict}
{'key2': 2, 'key1': 1}

dict(filter(lambda i:i[0] in validkeys, d.iteritems()))

최신 Python (2.7 +, 3.0 +)에서는 사전 이해를 사용합니다.

d = {'key1':1, 'key2':2, 'key3':3}
included_keys = ['key1', 'key2', 'key99']

{k:v for k,v in d.items() if k in included_keys}

if in dict comprehension이없는 다른 솔루션.

>>> a = {'key1':1, 'key2':2, 'key3':3}
>>> b = {'key1':1, 'key2':2}
>>> { k:a[k] for k in b.keys()}
{'key2': 2, 'key1': 1}

내 방법은 다음과 같습니다.

from operator import itemgetter

def subdict(d, ks):
    return dict(zip(ks, itemgetter(*ks)(d)))

my_dict = {'key1':1, 'key2':2, 'key3':3}

subdict(my_dict, ['key1', 'key3'])

최신 정보

하지만 위의 구현은 길이 ks가 0 또는 1 인 경우를 처리하지 않습니다 . 다음 코드는 상황을 처리하며 더 이상 한 줄짜리가 아닙니다.

def subdict(d, ks):
    vals = []
    if len(ks) >= 1:
        vals = itemgetter(*ks)(d)
        if len(ks) == 1:
            vals = [vals]
    return dict(zip(ks, vals))

복잡한 클래스 Myclasscollections.UserDict. 하위 집합을 선택하려면, 즉 모든 컨테이너 속성을 유지하려면 다음 sub과 같이 이름이 지정된 메서드를 정의하는 것이 편리합니다 .

def sub(self, keys):
    subset = Myclass() # no arguments; works if defined with only keyword arguments
    for key in keys:
        subset[key] = self[key]
    return subset

그 다음으로 사용됩니다 Myclass.sub([key1, key2 ...])

참고 URL : https://stackoverflow.com/questions/3953371/get-a-sub-set-of-a-python-dictionary

반응형