Programing

사전에 사전을 추가 하시겠습니까?

lottogame 2020. 3. 19. 08:15
반응형

사전에 사전을 추가 하시겠습니까? [복제]


이 질문에는 이미 답변이 있습니다.

기존 사전이 두 개 있는데 그 중 하나를 다른쪽에 '추가'하고 싶습니다. 즉, 다른 사전의 키, 값을 첫 번째 사전으로 만들어야 함을 의미합니다. 예를 들면 다음과 같습니다.

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
}

나는 이것이 for루프를 통해 달성 될 수 있다고 생각 하지만 (어쩌면?)이 방법을 구할 수있는 사전 방법이나 다른 모듈이 있습니까? 내가 사용하는 실제 사전은 정말 큽니다 ...


넌 할 수있어

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}

이것을 달성하는 가장 비현실적이고 (약간 빠른) 방법은 다음과 같습니다.

dest = {**orig, **extra}

또는 해결해야 할 문제에 따라 다음을 수행 할 수 있습니다.

dest = {**orig, 'D': 4, 'E': 5}

변경하고 싶지 않다고 가정하면 orig다른 답변과 같이 복사하고 업데이트하거나 두 사전의 모든 항목을 dict 생성자에 전달하여 한 번에 새 사전을 만들 수 있습니다.

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

또는 itertools없이 :

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

당신 만의 결과를 전달해야합니다 items()으로 list()파이썬 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)))

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}

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

update ([other]) 기존 키를 덮어 쓰면서 다른 키 / 값 쌍으로 사전을 업데이트합니다. 반환 없음

update ()는 다른 사전 객체 또는 키 / 값 쌍의 반복 가능 (튜플 또는 길이 2의 다른 반복 가능)을 허용합니다. 키워드 인수가 지정되면 사전은 해당 키 / 값 쌍으로 업데이트됩니다. d.update (red = 1, blue = 2).

버전 2.4으로 변경 : 인수가 키 / 값 쌍을 반복 가능하게하고 키워드 인수를 허용했습니다.


내가주고 싶은 대답은 "use collections.ChainMap"이지만 파이썬 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은 메모리를 거의 사용하지 않으며 하위 매핑에 대한 수정 사항을 나중에 볼 수 있습니다. 순서가 중요하기 때문에 체인을 사용하여 기본값을 계층화 할 수도 있습니다 (예 : 사용자 prefs> config> env).


두 개의 사전을 결합하거나 병합하는 3 개의 라이너 :

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

그러면 dest을 수정하지 않고 새 사전 만듭니다 .origextra

참고 : orig의 키 값이 다른 경우을 ( extra를) extra재정의 orig합니다.

참고 URL : https://stackoverflow.com/questions/8930915/append-dictionary-to-a-dictionary

반응형