사전 이해에서 if / else를 어떻게 사용할 수 있습니까?


138

Python 2.7 이상에는 다음과 같은 방법이 있습니까?

{ something_if_true if condition else something_if_false for key, value in dict_.items() }

나는 'if'만으로 무엇이든 만들 수 있다는 것을 알고 있습니다.

{ something_if_true for key, value in dict_.items() if condition}

4
@Marcin이 말했듯이 a dictkey:value요소로 구성되어 있습니다. dict여기서는 여기가 아니라 set( 리터럴 참조 ).
mdeous

답변:


247

당신은 이미 그것을 가지고 있습니다 : A if test else B유효한 파이썬 표현입니다. dict 이해력의 유일한 문제는 dict 이해력이있는 표현식의 위치에 콜론으로 구분 된 두 가지 표현식이 있어야한다는 것입니다.

{ (some_key if condition else default_key):(something_if_true if condition
          else something_if_false) for key, value in dict_.items() }

마지막 if절은 조건식과는 다른 필터 역할을합니다.


28
키와 값 모두에 if-else 조건이 필요하지 않다는 점을 언급 할 가치가 있습니다. 예를 들어 {(a if condition else b): value for key, value in dict.items()}작동합니다.
Jeremy Weirich

5
@JeremyWeirich 당신이 원하지 않는다면 그들 중 하나를 위해 if-else를 가질 필요는 없습니다.
Marcin

@Marcin 주요 부분에 "if"만 사용하고 값 부분에 "if"와 "else"를 모두 사용할 수 있습니까?
nithin11

14

@Marcin의 대답 은 모든 것을 다루지 만 누군가가 실제 예를보고 싶다면 아래에 두 가지를 추가하십시오.

다음과 같은 사전 세트가 있다고 가정 해 봅시다.

d = {'key1': {'a', 'b', 'c'}, 'key2': {'foo', 'bar'}, 'key3': {'so', 'sad'}}

키가 문자열 'a'에 값이 포함되어 있는지 여부를 나타내는 새 사전을 만들려면 다음을 사용할 수 있습니다.

dout = {"a_in_values_of_{}".format(k) if 'a' in v else "a_not_in_values_of_{}".format(k): v for k, v in d.items()}

생산량

{'a_in_values_of_key1': {'a', 'b', 'c'},
 'a_not_in_values_of_key2': {'bar', 'foo'},
 'a_not_in_values_of_key3': {'sad', 'so'}}

이제 두 개의 사전이 있다고 가정 해 봅시다.

d1 = {'bad_key1': {'a', 'b', 'c'}, 'bad_key2': {'foo', 'bar'}, 'bad_key3': {'so', 'sad'}}
d2 = {'good_key1': {'foo', 'bar', 'xyz'}, 'good_key2': {'a', 'b', 'c'}}

각각의 값이 동일한 경우 d1키로 키를 교체하려고합니다.d2

# here we assume that the values in d2 are unique
# Python 2
dout2 = {d2.keys()[d2.values().index(v1)] if v1 in d2.values() else k1: v1 for k1, v1 in d1.items()}

# Python 3
dout2 = {list(d2.keys())[list(d2.values()).index(v1)] if v1 in d2.values() else k1: v1 for k1, v1 in d1.items()}

어느 것이

{'bad_key2': {'bar', 'foo'},
 'bad_key3': {'sad', 'so'},
 'good_key2': {'a', 'b', 'c'}}

두 번째 예는 사용을 위해 d1, d2내가 얻을AttributeError: 'dict_values' object has no attribute 'index'
alancalvitti

@alancalvitti : 이것을 지적 해 주셔서 감사합니다! 이 솔루션은 Python 2 용이며 Python 3에서는 작동하지 않습니다. 파이썬 3 솔루션도 추가했습니다.
Cleb

3

키와 값에 대해 평가할 조건다른 경우 @Marcin의 답변이 좋습니다.

당신이있는 경우 동일한 조건 키와 값을, 당신은 (키, 값) 발전기 표현의 먹이로에서 -tuples 구축에 더 낫다 dict():

dict((modify_k(k), modify_v(v)) if condition else (k, v) for k, v in dct.items())

더 읽기 쉽고 조건은 키, 값당 한 번만 평가됩니다.

@Cleb의 사전 세트를 빌리는 예 :

d = {'key1': {'a', 'b', 'c'}, 'key2': {'foo', 'bar'}, 'key3': {'so', 'sad'}}

당신은 단지 접미사 할 가정 keys으로 a의에 value하고 싶은 value그러한 경우에 세트의 길이로 대체. 그렇지 않으면 키-값 쌍은 변경되지 않아야합니다.

dict((f"{k}_a", len(v)) if "a" in v else (k, v) for k, v in d.items())
# {'key1_a': 3, 'key2': {'bar', 'foo'}, 'key3': {'sad', 'so'}}

0

사전 이해에서 if / else를 사용하는 또 다른 예

내 사무실 업무를 위해 데이터 입력 데스크탑 응용 프로그램을 작업 중이며 이러한 데이터 입력 응용 프로그램은 입력 위젯에서 모든 항목을 가져와 유효성 검사 또는 편집과 같은 추가 처리를 위해 사전에 덤프하여 반환해야합니다. 파일에서 엔트리 위젯 등으로 선택된 데이터

전통적인 코딩 (8 줄)을 사용한 첫 번째 라운드 :

entries = {'name': 'Material Name', 'maxt': 'Max Working Temperature', 'ther': {100: 1.1, 200: 1.2}}

a_dic, b_dic = {}, {}

for field, value in entries.items():
    if field == 'ther':
        for k,v in value.items():
            b_dic[k] = v
        a_dic[field] = b_dic
    else:
        a_dic[field] = value
    
print(a_dic)
 {'name': 'Material Name', 'maxt': 'Max Working Temperature', 'ther': {100: 1.1, 200: 1.2}}”

두 번째 라운드에서는 사전 이해력을 사용하려고했지만 루프가 여전히 있습니다 (6 줄).

entries = {'name': 'Material Name', 'maxt': 'Max Working Temperature', 'ther': {100: 1.1, 200: 1.2}}

for field, value in entries.items():
    if field == 'ther':
        b_dic = {k:v for k,v in value.items()}
        a_dic[field] = b_dic
    else:
        a_dic[field] = value
    
print(a_dic)
 {'name': 'Material Name', 'maxt': 'Max Working Temperature', 'ther': {100: 1.1, 200: 1.2}}”

마지막으로 한 줄 사전 이해 문 (한 줄)으로 :

entries = {'name': 'Material Name', 'maxt': 'Max Working Temperature', 'ther': {100: 1.1, 200: 1.2}}

a_dic = {field:{k:v for k,v in value.items()} if field == 'ther' 
        else value for field, value in entries.items()}
    
print(a_dic)
 {'name': 'Material Name', 'maxt': 'Max Working Temperature', 'ther': {100: 1.1, 200: 1.2}}”

나는 파이썬 3.8.3을 사용한다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.