사전을 다른 사전으로 확장하는 가장 좋은 방법은 무엇입니까? 예를 들어 :
>>> a = { "a" : 1, "b" : 2 }
>>> b = { "c" : 3, "d" : 4 }
>>> a
{'a': 1, 'b': 2}
>>> b
{'c': 3, 'd': 4}
이 회피 for
루프 를 얻기 위해 어떤 작업을 찾고 있습니다 .
{ "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
나는 다음과 같은 것을하고 싶다 :
a.extend(b) # This does not work
답변
a.update(b)
답변
이 닫힌 질문 에서 아름다운 보석 :
입력 dicts를 변경하지 않는 “oneliner way”는
basket = dict(basket_one, **basket_two)
무엇을 알아보기 **basket_two
((가) **
) 여기에 의미합니다 .
충돌하는 경우의 항목 basket_two
이 의 항목을 재정의합니다 basket_one
. 한 줄짜리가 가면, 이것은 읽기 쉽고 투명하며, 다른 두 가지가 섞인 받아쓰기가 도움이 될 때마다 그것을 사용하는 것에 대한 징계가 없습니다 (이해하기 어려운 독자는 실제로 이것이 그 또는 그녀가 배우고 dict
그 **
형태 를 배우도록 자극하는 방식 ;-). 예를 들어 다음과 같이 사용합니다.
x = mungesomedict(dict(adict, **anotherdict))
내 코드에서 합리적으로 자주 발생합니다.
Alex Martelli가 처음 제출 함
참고 : Python 3에서는 basket_two의 모든 키가 a 인 경우에만 작동합니다 string
.
답변
사전 매핑과 함께 사전 이해를 사용해 보셨습니까?
a = {'a': 1, 'b': 2}
b = {'c': 3, 'd': 4}
c = {**a, **b}
# c = {"a": 1, "b": 2, "c": 3, "d": 4}
또 다른 방법은 dict (iterable, ** kwarg)를 사용하는 것입니다
c = dict(a, **b)
# c = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
# use the merging operator |
c = a | b
# c = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
답변
a.update(b)
에서 키와 값을 추가합니다 B 에 이미 키에 대한 값이 있다면 덮어 씁니다.
답변
다른 사람이 언급 한 바와 같이 a.update(b)
일부 dicts을 위해 a
그리고 b
당신은 당신의 질문에 요구 한 결과를 얻을 것입니다. 그러나 extend
객체 매핑 / 설정 방법이 구문 a.extend(b)
에서 a
값을 값으로 덮어 쓰지 않아야 한다는 것을 여러 번 보았 음을 지적하고 싶습니다 b
. 의 값을 a.update(b)
덮어 쓰 a
므로에 적합하지 않습니다 extend
.
일부 언어는이 메소드를 호출합니다 defaults
또는 inject
이미있을 수있는 값을 덮어 쓰지 않고 사전에에서 (기본 값 세트 수 있습니다) B의 값을 주입하는 방법으로 생각 될 수있는.
물론, 당신 a.extend(b)
은 거의 같은 메모를 할 수 b.update(a); a=b
있습니다. 과제를 제거하려면 다음과 같이하면됩니다.
def extend(a,b):
"""Create a new dictionary with a's properties extended by b,
without overwriting.
>>> extend({'a':1,'b':2},{'b':3,'c':4})
{'a': 1, 'c': 4, 'b': 2}
"""
return dict(b,**a)
에 부작용이없는 dict
생성자를 사용하는 스마트 아이디어에 대한 Tom Leys에게 감사합니다 extend
.
답변
python 3.3에서 도입 된 python ‘s collections.Chainmap 을 사용할 수도 있습니다 .
from collections import Chainmap
c = Chainmap(a, b)
c['a'] # returns 1
사용 사례에 따라 몇 가지 장점이 있습니다. 여기 에 더 자세히 설명되어 있지만 간단한 개요를 제공합니다.
- 체인 맵은 사전보기 만 사용하므로 실제로 데이터가 복사되지 않습니다. 결과적으로 체인 속도가 빨라지지만 조회 속도는 느려집니다.
- 실제로 덮어 쓰는 키가 없으므로 필요한 경우 데이터가 a인지 b인지를 알 수 있습니다.
이것은 주로 구성 사전과 같은 것들에 유용합니다.
답변
당신이 그것을 필요로하는 경우 Class dict로 확장하고 update 메소드를 사용할 수 있습니다 .
Class a(dict):
# some stuff
self.update(b)