반응형
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))
복잡한 클래스 Myclass
가 collections.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
반응형
'Nice programing' 카테고리의 다른 글
C #에서 새 연산자를 만들 수 있습니까? (0) | 2020.12.08 |
---|---|
HTML을 만드는 방법 (0) | 2020.12.08 |
Android : 현재 테마의 리소스 ID를 얻는 방법은 무엇입니까? (0) | 2020.12.08 |
글로벌 범위와 글로벌 네임 스페이스 (0) | 2020.12.08 |
정렬 된 세트의 모든 구성원 가져 오기 (0) | 2020.12.08 |