키가 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)
그러나 나는 이것에 대해 강력히 권장합니다. 이것은 코드 골프, 유지 보수 및 가독성을 방해합니다.
>>> 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'}
dict.setdefault()
값에 액세스하려고 할 때만 실제로 사용해야합니다.
setdefault()
은 무슨 일이 일어나고 있는지 명확하게 설명합니다. 값을 반환한다는 것은 그다지 중요하지 않으며 약간 기발한 IMO입니다. 이것이 바람직하지 않은 이유에 대해 빠른 설명이나 링크를 제공 할 수 있습니까?
for obj in iterable: d.setdefault(key_for_obj(obj), []).append(obj)
. 반환되는 값에 대해 별난 것은 없습니다. 그것이 메소드의 요점입니다 .
if key not in d:
테스트를 사용하십시오 .
setdefault()
것은 당신이 말한 것에 맞춰진 것 같습니다. a를 사용하면 defaultdict(list)
예제보다 더 읽기 쉬운 코드가 생성되므로 표준 사전으로 작업해야하는 경우가 아니면 사용할 수 없습니다. 전반적 if key not in d
으로 더 명확합니다.
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 이해와 비교하는 속도 테스트.
d = default_vals.copy()
첫 번째 경우에 사본 ( )이 만들어 지지 않은 경우, 우리가 수십 배 10**5
이상에 도달하면 가장 많이 투표 된 답변이 더 빨라질 것 입니다. 두 방법의 메모리 공간은 동일합니다.
{**default_values, **{ key: value }}
위의 답변에 따르면 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()
사전에 대한 추가 조회를 피합니다. 즉, 작지만 여전히 성능이 향상됩니다.