programing

사전 이해에서 if/else를 사용하려면 어떻게 해야 합니까?

kingscode 2022. 10. 9. 11:48
반응형

사전 이해에서 if/else를 사용하려면 어떻게 해야 합니까?

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}

이미 알고 있습니다.A if test else B는 유효한 Python 표현입니다.그림과 같이 딕트 이해의 유일한 문제는 딕트 이해의 표현 위치가 콜론으로 구분된 두 개의 표현이어야 한다는 것입니다.

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

파이널if절은 필터로 기능합니다.이것은 조건식을 갖는 것과는 다릅니다.

@Marcin의 답변으로 모든 것을 커버하고 있습니다만, 만약 누군가가 실제의 예를 보고 싶어 한다면, 이하에 2가지를 덧붙입니다.

다음과 같은 세트 사전이 있다고 가정해 보겠습니다.

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'}}

키와 값을 평가하는 조건이 다른 경우 @Marcin의 답변이 좋습니다.

키와 값의 조건이 같으면 생성기(키, 값)에 포함된 튜플을 사용하는 것이 좋습니다.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'}}

또한 If 스테이트먼트만 if를 마지막에 붙이면 다음과 같이 언급할 필요가 있습니다.

{_ for _ in iterable if True}

사전 이해에서 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}}”

마지막으로 한 줄 사전 이해 문장의 경우(1줄):

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}}”

python 3.8.3을 사용합니다.

언급URL : https://stackoverflow.com/questions/9442724/how-can-i-use-if-else-in-a-dictionary-comprehension

반응형