파이썬에서 사전을 어떻게 병합합니까?
d3 = dict(d1, **d2)
나는 이것이 사전을 병합한다는 것을 이해합니다. 그러나 그것은 독특합니까? d1에 d2와 동일한 키가 있지만 값이 다른 경우 어떻게됩니까? d1과 d2를 병합하고 싶지만 중복 키가 있으면 d1이 우선합니다.
.update()
원본이 d2
더 이상 필요하지 않으면 방법을 사용할 수 있습니다 .
다른 키 / 값 쌍으로 사전을 업데이트하고 기존 키를 덮어 씁니다 . 반환
None
.
예 :
>>> d1 = {'a': 1, 'b': 2}
>>> d2 = {'b': 1, 'c': 3}
>>> d2.update(d1)
>>> d2
{'a': 1, 'c': 3, 'b': 2}
최신 정보:
물론 병합 된 새 사전을 만들기 위해 먼저 사전을 복사 할 수 있습니다. 이것은 필요하거나 필요하지 않을 수 있습니다. 사전에 복합 객체 (목록 또는 클래스 인스턴스와 같은 다른 객체를 포함하는 객체)가있는 copy.deepcopy
경우에도 고려되어야합니다.
Python2에서는
d1={'a':1,'b':2}
d2={'a':10,'c':3}
d1이 d2를 재정의합니다.
dict(d2,**d1)
# {'a': 1, 'c': 3, 'b': 2}
d2는 d1을 재정의합니다.
dict(d1,**d2)
# {'a': 10, 'c': 3, 'b': 2}
이 동작은 단순히 구현의 우연이 아닙니다. 문서에서 보장 됩니다 .
키가 위치 인수와 키워드 인수 모두에 지정되면 키워드와 연관된 값이 사전에 유지됩니다.
d1
충돌에 우선 순위 를 두려면 다음 을 수행하십시오.
d3 = d2.copy()
d3.update(d1)
그렇지 않으면 반전 d2
및 d1
.
내 해결책은 병합 기능 을 정의하는 것입니다. 정교하지 않고 한 줄만 들었습니다. 다음은 Python 3의 코드입니다.
from functools import reduce
from operator import or_
def merge(*dicts):
return { k: reduce(lambda d, x: x.get(k, d), dicts, None) for k in reduce(or_, map(lambda x: x.keys(), dicts), set()) }
테스트
>>> d = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
>>> d_letters = {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z', 26: 'A', 27: 'B', 28: 'C', 29: 'D', 30: 'E', 31: 'F', 32: 'G', 33: 'H', 34: 'I', 35: 'J', 36: 'K', 37: 'L', 38: 'M', 39: 'N', 40: 'O', 41: 'P', 42: 'Q', 43: 'R', 44: 'S', 45: 'T', 46: 'U', 47: 'V', 48: 'W', 49: 'X', 50: 'Y', 51: 'Z'}
>>> merge(d, d_letters)
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z', 26: 'A', 27: 'B', 28: 'C', 29: 'D', 30: 'E', 31: 'F', 32: 'G', 33: 'H', 34: 'I', 35: 'J', 36: 'K', 37: 'L', 38: 'M', 39: 'N', 40: 'O', 41: 'P', 42: 'Q', 43: 'R', 44: 'S', 45: 'T', 46: 'U', 47: 'V', 48: 'W', 49: 'X', 50: 'Y', 51: 'Z'}
>>> merge(d_letters, d)
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z', 26: 'A', 27: 'B', 28: 'C', 29: 'D', 30: 'E', 31: 'F', 32: 'G', 33: 'H', 34: 'I', 35: 'J', 36: 'K', 37: 'L', 38: 'M', 39: 'N', 40: 'O', 41: 'P', 42: 'Q', 43: 'R', 44: 'S', 45: 'T', 46: 'U', 47: 'V', 48: 'W', 49: 'X', 50: 'Y', 51: 'Z'}
>>> merge(d)
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
>>> merge(d_letters)
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z', 26: 'A', 27: 'B', 28: 'C', 29: 'D', 30: 'E', 31: 'F', 32: 'G', 33: 'H', 34: 'I', 35: 'J', 36: 'K', 37: 'L', 38: 'M', 39: 'N', 40: 'O', 41: 'P', 42: 'Q', 43: 'R', 44: 'S', 45: 'T', 46: 'U', 47: 'V', 48: 'W', 49: 'X', 50: 'Y', 51: 'Z'}
>>> merge()
{}
임의의 수의 사전 인수에 대해 작동합니다. 해당 사전에 중복 키가있는 경우 인수 목록에서 맨 오른쪽 사전의 키가 우선합니다.
Trey Hunner has a nice blog post outlining several options for merging multiple dictionaries, including (for python3.3+) ChainMap and dictionary unpacking.
I believe that, as stated above, using d2.update(d1)
is the best approach and that you can also copy d2
first if you still need it.
Although, I want to point out that dict(d1, **d2)
is actually a bad way to merge dictionnaries in general since keyword arguments need to be strings, thus it will fail if you have a dict
such as:
{
1: 'foo',
2: 'bar'
}
참고URL : https://stackoverflow.com/questions/2799064/how-do-i-merge-dictionaries-together-in-python
'program story' 카테고리의 다른 글
LINQ 쿼리에서 GROUP BY를 사용하여 MAX 행을 어떻게 얻습니까? (0) | 2020.09.18 |
---|---|
DIV를 하단 또는 기준선에 정렬 (0) | 2020.09.18 |
HTTP POST 요청에 JSON 전달 (0) | 2020.09.18 |
Clang으로 C ++를 어떻게 컴파일합니까? (0) | 2020.09.18 |
OSX의 명령 줄에서 GUI Emacs를 시작하는 방법은 무엇입니까? (0) | 2020.09.18 |