동일한 키로 여러 사전을 병합하는 방법은 무엇입니까?
다음과 같은 dicts/key-value 쌍이 여러 개 있습니다.
d1 = {key1: x1, key2: y1}
d2 = {key1: x2, key2: y2}
결과가 새 사전이 되기를 원합니다(가능한 경우 가장 효율적인 방법으로).
d = {key1: (x1, x2), key2: (y1, y2)}
실제로 결과 d가 다음과 같기를 원합니다.
d = {key1: (x1.x1attrib, x2.x2attrib), key2: (y1.y1attrib, y2.y2attrib)}
누군가가 첫 번째 결과를 얻는 방법을 보여주면 나머지는 알아낼 수 있습니다.
모든 키가 모든 사전에 항상 존재한다고 가정합니다.
ds = [d1, d2]
d = {}
for k in d1.iterkeys():
d[k] = tuple(d[k] for d in ds)
참고: Python 3.x에서는 아래 코드를 사용합니다.
ds = [d1, d2]
d = {}
for k in d1.keys():
d[k] = tuple(d[k] for d in ds)
dic에 numpy 배열이 포함된 경우:
ds = [d1, d2]
d = {}
for k in d1.keys():
d[k] = np.concatenate(list(d[k] for d in ds))
다음은 키가 일부 사전에만 있는 경우와 함께 임의의 양의 사전을 처리하는 일반적인 솔루션입니다.
from collections import defaultdict
d1 = {1: 2, 3: 4}
d2 = {1: 6, 3: 7}
dd = defaultdict(list)
for d in (d1, d2): # you can list as many input dicts as you want here
for key, value in d.iteritems():
dd[key].append(value)
print(dd)
쇼:
defaultdict(<type 'list'>, {1: [2, 6], 3: [4, 7]})
또한, 를 얻으려면 다음 .attrib
으로 변경하십시오 append(value)
.append(value.attrib)
d1과 d2만 있으면
from collections import defaultdict
d = defaultdict(list)
for a, b in d1.items() + d2.items():
d[a].append(b)
dict1 = {'m': 2, 'n': 4}
dict2 = {'n': 3, 'm': 1}
키의 순서가 동일한지 확인:
dict2_sorted = {i:dict2[i] for i in dict1.keys()}
keys = dict1.keys()
values = zip(dict1.values(), dict2_sorted.values())
dictionary = dict(zip(keys, values))
제공:
{'m': (2, 1), 'n': (4, 3)}
다음은 두 사전에 동일한 키가 없는 경우에도 사용할 수 있는 한 가지 접근 방식입니다.
d1 = {'a':'test','b':'btest','d':'dreg'}
d2 = {'a':'cool','b':'main','c':'clear'}
d = {}
for key in set(d1.keys() + d2.keys()):
try:
d.setdefault(key,[]).append(d1[key])
except KeyError:
pass
try:
d.setdefault(key,[]).append(d2[key])
except KeyError:
pass
print d
그러면 아래 입력이 생성됩니다.
{'a': ['test', 'cool'], 'c': ['clear'], 'b': ['btest', 'main'], 'd': ['dreg']}
def merge(d1, d2, merge):
result = dict(d1)
for k,v in d2.iteritems():
if k in result:
result[k] = merge(result[k], v)
else:
result[k] = v
return result
d1 = {'a': 1, 'b': 2}
d2 = {'a': 1, 'b': 3, 'c': 2}
print merge(d1, d2, lambda x, y:(x,y))
{'a': (1, 1), 'c': 2, 'b': (2, 3)}
파이썬 3.x 업데이트
Eli Bendersky의 답변:
Python 3에서 제거된 dict.iteritems는 대신 dict.items를 사용합니다. Python 위키 참조: https://wiki.python.org/moin/Python3.0
from collections import defaultdict
dd = defaultdict(list)
for d in (d1, d2):
for key, value in d.items():
dd[key].append(value)
두 가지 목록 솔루션을 보완하기 위해 단일 목록 을 처리하는 솔루션이 있습니다.
샘플 목록(NetworkX 관련, 가독성을 위해 여기에 수동으로 형식 지정):
ec_num_list = [((src, tgt), ec_num['ec_num']) for src, tgt, ec_num in G.edges(data=True)]
print('\nec_num_list:\n{}'.format(ec_num_list))
ec_num_list:
[((82, 433), '1.1.1.1'),
((82, 433), '1.1.1.2'),
((22, 182), '1.1.1.27'),
((22, 3785), '1.2.4.1'),
((22, 36), '6.4.1.1'),
((145, 36), '1.1.1.37'),
((36, 154), '2.3.3.1'),
((36, 154), '2.3.3.8'),
((36, 72), '4.1.1.32'),
...]
동일한 가장자리(튜플에 의해 정의됨)에 대한 중복 값에 유의하십시오. 해당 "키"에 해당 "값"을 대조하려면:
from collections import defaultdict
ec_num_collection = defaultdict(list)
for k, v in ec_num_list:
ec_num_collection[k].append(v)
print('\nec_num_collection:\n{}'.format(ec_num_collection.items()))
ec_num_collection:
[((82, 433), ['1.1.1.1', '1.1.1.2']), ## << grouped "values"
((22, 182), ['1.1.1.27']),
((22, 3785), ['1.2.4.1']),
((22, 36), ['6.4.1.1']),
((145, 36), ['1.1.1.37']),
((36, 154), ['2.3.3.1', '2.3.3.8']), ## << grouped "values"
((36, 72), ['4.1.1.32']),
...]
필요한 경우 해당 목록을 dict로 변환합니다.
ec_num_collection_dict = {k:v for k, v in zip(ec_num_collection, ec_num_collection)}
print('\nec_num_collection_dict:\n{}'.format(dict(ec_num_collection)))
ec_num_collection_dict:
{(82, 433): ['1.1.1.1', '1.1.1.2'],
(22, 182): ['1.1.1.27'],
(22, 3785): ['1.2.4.1'],
(22, 36): ['6.4.1.1'],
(145, 36): ['1.1.1.37'],
(36, 154): ['2.3.3.1', '2.3.3.8'],
(36, 72): ['4.1.1.32'],
...}
참고문헌
- [이 스레드] 동일한 키로 여러 사전을 병합하는 방법은 무엇입니까?
- [파이썬 문서] https://docs.python.org/3.7/library/collections.html#collections.defaultdict
컴팩트한 가능성
d1={'a':1,'b':2}
d2={'c':3,'d':4}
context={**d1, **d2}
context
{'b': 2, 'c': 3, 'd': 4, 'a': 1}
ReferenceURL : https://stackoverflow.com/questions/5946236/how-to-merge-multiple-dicts-with-same-key
'IT이야기' 카테고리의 다른 글
Eclipse에서 Java의 도달할 수 없는 코드 오류 대 데드 코드 경고? (0) | 2021.10.14 |
---|---|
SQL Server 2008에서 트랜잭션 로그를 보는 방법 (0) | 2021.10.14 |
C에서 변수가 특정 유형(두 유형 비교)인지 어떻게 확인합니까? (0) | 2021.10.14 |
Django - FileField가 없는지 확인 (0) | 2021.10.13 |
항아리 안의 참조 항아리 (0) | 2021.10.13 |