IT

사전을 사전에 추가하다

itgroup 2022. 11. 18. 21:34
반응형

사전을 사전에 추가하다

저는 두 개의 기존 사전을 가지고 있는데, 그 중 하나를 다른 것에 '추가'하고 싶습니다.즉, 다른 사전의 키와 값을 첫 번째 사전으로 만들어야 한다는 것입니다.예를 들어 다음과 같습니다.

orig = {
   'A': 1,
   'B': 2,
   'C': 3,
}

extra = {
   'D': 4,
   'E': 5,
}

dest = # Something here involving orig and extra

print dest
{
   'A': 1,
   'B': 2,
   'C': 3,
   'D': 4,
   'E': 5
}

저는 이 모든 것을 이 모든 것을 통해서forloop(아마?)입니다만, 이 작업을 저장할 수 있는 사전이나 다른 모듈이 있습니까?제가 쓰고 있는 사전은 정말 커서...

할수있습니다

orig.update(extra)

아니면, 당신이 원하지 않는다면orig수정할 복사본을 먼저 만듭니다.

dest = dict(orig)  # or orig.copy()
dest.update(extra)

extra와 orig에 중복되는 키가 있는 경우 최종값은 extra에서 가져옵니다.예를들면,

>>> d1 = {1: 1, 2: 2}
>>> d2 = {2: 'ha!', 3: 3}
>>> d1.update(d2)
>>> d1
{1: 1, 2: 'ha!', 3: 3}

한 사전을 다른 사전에 추가하는 방법은 두 가지가 있습니다.

업데이트(수정)orig제자리)

orig.update(extra)    # Python 2.7+
orig |= extra         # Python 3.9+

병합(새 사전 만들기)

# Python 2.7+
dest = collections.ChainMap(orig, extra)
dest = {k: v for d in (orig, extra) for (k, v) in d.items()}

# Python 3
dest = {**orig, **extra}          
dest = {**orig, 'D': 4, 'E': 5}

# Python 3.9+ 
dest = orig | extra

이러한 조작은 교환적이지 않습니다.어느 경우든 후자가 승자입니다.예.

orig  = {'A': 1, 'B': 2}
extra = {'A': 3, 'C': 3}

dest = orig | extra
# dest = {'A': 3, 'B': 2, 'C': 3}

dest = extra | orig
# dest = {'A': 1, 'B': 2, 'C': 3}

또한 Python 3.7(및 CPython 3.6)에서만 사용 가능dict가 정렬되어 있습니다.따라서 이전 버전에서는 사전의 항목 순서가 다를 수 있습니다.

dict.update() 네가 원하는 대로 될 것 같은데...

>> orig.update(extra)
>>> orig
{'A': 1, 'C': 3, 'B': 2, 'E': 5, 'D': 4}
>>> 

그러나 원본 사전을 업데이트하지 않고 사본으로 작업하는 것이 좋습니다.

>>> dest = orig.copy()
>>> dest.update(extra)
>>> orig
{'A': 1, 'C': 3, 'B': 2}
>>> dest
{'A': 1, 'C': 3, 'B': 2, 'E': 5, 'D': 4}

변경을 원하지 않는 경우orig다른 답변과 마찬가지로 복사 및 업데이트를 수행하거나 두 사전의 모든 항목을 dict 컨스트럭터에 전달하여 한 번에 새 사전을 만들 수 있습니다.

from itertools import chain
dest = dict(chain(orig.items(), extra.items()))

또는 반복 툴이 없는 경우:

dest = dict(list(orig.items()) + list(extra.items()))

다음 결과만 통과하면 됩니다.items()안으로list()Python 3, 2.x의 경우dict.items()이미 리스트를 반환하고 있기 때문에 할 수 있습니다.dict(orig.items() + extra.items()).

보다 일반적인 사용 사례로, 하나의 dict에 결합하고자 하는 더 큰 dict 목록이 있다고 가정하면 다음과 같은 작업을 수행할 수 있습니다.

from itertools import chain
dest = dict(chain.from_iterable(map(dict.items, list_of_dicts)))

두 사전을 결합하거나 병합하는 세 줄 줄:

dest = {}
dest.update(orig)
dest.update(extra)

그러면 새 사전이 생성됩니다.dest수정하지 않고orig그리고.extra.

주의: 키의 값이 다른 경우orig그리고.extra,그리고나서extra오버라이드orig.

.update() 메서드가 있습니다. : )

업데이트([기타])다른 키/값 쌍으로 사전을 업데이트하여 기존 키를 덮어씁니다.반환 없음.

update()는 다른 사전 객체 또는 키/값 쌍의 반복 가능(tuples 또는 길이 2의 다른 반복 가능) 중 하나를 받아들입니다.키워드 인수를 지정하면 사전이 d.update(red=1, blue=2)와 같은 키/값 쌍으로 업데이트됩니다.

버전 2.4에서 변경됨: 인수를 키/값 쌍 및 허용된 키워드 인수로 반복할 수 있습니다.

제가 드리고 싶은 대답은 "컬렉션 사용"입니다.ChainMap"은 Python 3.3에서만 추가된 것을 알게 되었습니다.https://docs.python.org/3.3/library/collections.html#chainmap-objects

3.3 소스에서 클래스를 잘라낼 수 있습니다.http://hg.python.org/cpython/file/3.3/Lib/collections/init.py#l763

다음은 기능이 부족한 Python 2.x 호환 버전(같은 작성자)입니다.http://code.activestate.com/recipes/305268-chained-map-lookups/

dict.merge를 사용하여 한 사전을 다른 사전으로 확장/덮어쓰거나 두 사전을 병합하는 추가 복사본을 만드는 대신 두 사전을 순서대로 검색하는 검색 체인을 만듭니다.매핑을 복제하지 않기 때문에 ChainMap은 메모리를 거의 사용하지 않으며 나중에 서브맵에 대한 수정도 볼 수 있습니다.순서는 중요하기 때문에 체인을 사용하여 기본값(예를 들어 user prefs > config > env)을 레이어할 수도 있습니다.

언급URL : https://stackoverflow.com/questions/8930915/append-a-dictionary-to-a-dictionary

반응형