키가 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'}
답변
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
이상에 도달하면 가장 많이 투표 된 답변이 더 빨라질 것 입니다. 두 방법의 메모리 공간은 동일합니다.
답변
위의 답변에 따르면 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()
사전에 대한 추가 조회를 피합니다. 즉, 작지만 여전히 성능이 향상됩니다.