[python] 파이썬은 존재하지 않는 경우 dict의 키를 업데이트합니다.

키가 dict.keys ()에 없으면 키-값 쌍을 dict에 삽입하고 싶습니다. 기본적으로 다음과 같이 할 수 있습니다.

if key not in d.keys():
    d[key] = value

그러나 더 나은 방법이 있습니까? 아니면이 문제에 대한 비단뱀적인 해결책은 무엇입니까?



답변

당신은 호출 할 필요는 없습니다 d.keys()때문에,

if key not in d:
    d[key] = value

충분합니다. 더 명확하고 읽기 쉬운 방법은 없습니다.

dict.get()키가 이미있는 경우 기존 값을 반환하는로 다시 업데이트 할 수 있습니다 .

d[key] = d.get(key, value)

그러나 나는 이것에 대해 강력히 권장합니다. 이것은 코드 골프, 유지 보수 및 가독성을 방해합니다.


답변

사용 dict.setdefault():

>>> d = {1: 'one'}
>>> d.setdefault(1, '1')
'one'
>>> d    # d has not changed because the key already existed
{1: 'one'}
>>> d.setdefault(2, 'two')
'two'
>>> d
{1: 'one', 2: 'two'}


답변

Python 3.9 부터 병합 연산자 | 를 사용하여 두 개의 사전을 병합 할 수 있습니다 . 오른쪽의 사전이 우선합니다.

new_dict = old_dict | { key: val }

예를 들면 :

new_dict = { 'a': 1, 'b': 2 } | { 'b': 42 }

print(new_dict} # {'a': 1, 'b': 42}

참고 : 이렇게하면 업데이트 된 값으로 새 사전이 생성됩니다.


답변

다음을 사용하여 여러 값을 삽입 할 수 있고 기본값도 가질 수 있지만 새 사전을 만듭니다.

d = {**{ key: value }, **default_values}

가장 많이 투표 한 답변으로 테스트했으며 평균적으로 다음 예제에서 볼 수 있듯이 더 빠릅니다.

for 루프 기반 방법을 unpack 연산자로 dict 이해와 비교하는 속도 테스트
for 루프 기반 방법을 unpack 연산자 방법으로 dict 이해와 비교하는 속도 테스트.

d = default_vals.copy()첫 번째 경우에 사본 ( )이 만들어 지지 않은 경우, 우리가 수십 배 10**5이상에 도달하면 가장 많이 투표 된 답변이 더 빨라질 것 입니다. 두 방법의 메모리 공간은 동일합니다.


답변

위의 답변에 따르면 setdefault () 메서드가 저에게 효과적 이었습니다.

old_attr_name = mydict.setdefault(key, attr_name)
if attr_name != old_attr_name:
    raise RuntimeError(f"Key '{key}' duplication: "
                       f"'{old_attr_name}' and '{attr_name}'.")

이 솔루션은 일반적이지 않습니다. 이 특정한 경우에 저에게 딱 맞았습니다. 정확한 해결책은 key첫 번째를 확인하는 것입니다 (이미 권고 한대로).하지만 setdefault()사전에 대한 추가 조회를 피합니다. 즉, 작지만 여전히 성능이 향상됩니다.


답변