답변:
당신은 이미 그것을 가지고 있습니다 : 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
절은 조건식과는 다른 필터 역할을합니다.
{(a if condition else b): value for key, value in dict.items()}
작동합니다.
@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'
키와 값에 대해 평가할 조건 이 다른 경우 @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'}}
사전 이해에서 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을 사용한다
dict
는key:value
요소로 구성되어 있습니다.dict
여기서는 여기가 아니라set
( 리터럴 참조 ).