2017-09-12 1 views
1

나는 dict { 'a': 'a', 'b': 0, 'c': {} }을 가지고 있으므로 값이 비어있는 모든 키를 생략해야합니다 (0은 비어 있지 않은 것으로 간주됩니다). 따라서이 출력은 { 'a': 'a', 'b': 0 }이어야합니다.비어있는 (0이 아닌) 값이있는 키를 생략하는 방법

{ 'a': 'a', 'b': 0, 'c': { 'd': 'd' } } ->{ 'a': 'a', 'b': 0, 'c': { 'd': 'd' } };

나는 {k: v for k,v in my_dict.items() if not v}과 같은 것을 시도했지만 0을 보존하는 방법을 모르겠습니다.

나는 아마 이런 https://lodash.com/docs/4.17.4#omitBy

+1

'v == 0 또는 v가 아닌'으로 조건을 변경하면 0이 포함됩니다. –

답변

2

값을 기반으로 필터링을위한 술어를 취하는 함수를 작성할 수 있습니다.

def omit_by(dct, predicate=lambda x: x!=0 and not x): 
    return {k: v for k, v in dct.items() if not predicate(v)} 

dct = { 'a': 'a', 'b': 0, 'c': {} } 
print(omit_by(dct)) 
# {'a': 'a', 'b': 0} 

dct = {'a': 'a', 'b': 0, 'c': { 'd': 'd' } } 
print(omit_by(dct)) 
# {'a': 'a', 'b': 0, 'c': {'d': 'd'}} 

간단하게 술어를 스위트로 변경하십시오.

+0

이것은 lodash의'omitBy()'의 반대이다 : 그것은 술어와 일치하는 모든 항목을 포함하는 반면, 이름은 그 반대이다. 처음에는 그러한 기능을 정의하는 데 많은 요점을 찾지 못합니다. 사전 독해를 철자하는 것이 더 읽기 쉽고 빠르기 때문입니다. 나는 또한 마지막 예제의 결과를 이해하지 못한다; 'dct'의 재정의가 누락 된 것처럼 보입니다. –

+0

@SvenMarnach 정리를 마쳤습니다. 마지막 부분에 복사하여 붙여 넣기 문제가있었습니다. 결정된. Lodash와 마찬가지로 술어의 사용과 일치하는 함수를 사용했습니다. 그들은 그것을 자유롭게 제거 할 수 있습니다. 눈을 가져 주셔서 감사합니다. –

1

뭔가 뭔가를 찾고 있어요?

res = { k:v for k,v in source_dict.items() if (hasattr(v, '__len__') and len(v) > 0) or isinstance(v, int) } 

참고 : 당신은 당신의 요구에 맞게 이해의 if ... 부분을 적용해야합니다. 이 조건은 예제에 표시되는 유형에서 작동하지만 필요에 따라 조건을 추가해야합니다 (또한 키에 포함 된 여러 유형을 고려할 때 조건이 상당히 증가 할 수 있습니다 ...)

+0

'없음'은 어떻게됩니까? –

+0

int가 길이가 없음에 대해 '0'에 대한 오류가 발생합니다. –

+0

@Denis 데이터가 실제로 일치하는 조건을 적용하지 마십시오 (내 편집 참조). – GPhilo

0
def purify(dict): 
    for k,v in dict: 
     if isinstance(v, list) or isinstance(v, set) or isinstance(v, dict): 
      if len(v) == 0: 
       del dict[k] 
    return dict 

당신은 너무처럼 사용할 수 있습니다 dict = purify(src)

+0

이러한 유형에는'len()'만 있습니다. 보다 일반적인 조건은 IMO'v가 None이 아니고'hasattr (v, '__len __') '이면 – GPhilo

+0

여기서'None'-ness를 확인할 필요가 없습니다 –

+0

제가 만든 테스트에서 복사 - 붙여 넣기 남은 것이 었습니다. None has has has returns with hasattr – GPhilo

0

왜 항목이 비어 있는지 여부를 테스트하는 기능을 정의하지? ('empty'의 정의는 나를 위해 사용법에 대한 사용자 정의가 될 수있다.)

def not_empty(item): 
    ''' 
    define what's empty 
    ''' 
    if isinstance(item, (dict, list)) and (not item): 
     return False 
    if item is None: 
     return False 
    # add more situations? 
    return True 

    sample_dict = { 'a': 'a', 'b': 0, 'c': {} } 

    result = {k:v for k,v in sample_dict.items() if not_empty(v)} 
관련 문제