[Python] 2개 딕셔너리 합치기 + about ' itertools '


파이썬의 두 딕셔너리를 하나로 합할 수 있을까?

있다.



방법 1 : update([대상])


update() 함수를 사용하면, 기준 딕셔너리의 키/값 쌍이 대상의 키/값 쌍으로 업데이트되고, none 이 반환된다. 
대상은 딕셔너리 객체일 수도 있고, 키/값 쌍일 수도 있다. 

예를 들면, dict1 과 dict2가 있다고 할 때,
dict2.update(dict1) 을 하면, update는 none을 반환하고 dict2에는 dict1이 덮어씌워진다. 중복된 것은 dict1의 것으로 대체된다.

또, dict.update(1=one, 2=two) 처럼 할 수도 있다.



방법 2: print dict(dict2, **dict1)


이 경우에는 dict1이 dict2를 덮어 쓴다.



** 주의해야 할 것은, 중복된 쌍이 바뀌기 때문에 위 방법들은 키 값이 변해도 상관 없을 때 쓰자.







그럼, 두 딕셔너리의 키/값을 모두 유지하면서 병합하려면?


조금 복잡하지만 아래와 같이 하면 된다.

퍼왔다. 지우라고 하면 지운다. (by )


from itertools import chain
from collections import defaultdict
dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3}
dict2 = {'bookC': 2, 'bookD': 4, 'bookE': 5}
dict3 = defaultdict(list)
for k, v in chain(dict1.items(), dict2.items()):
    dict3[k].append(v)
for k, v in dict3.items():
    print(k, v)


결과는
('bookA', [1])
('bookB', [2])
('bookC', [3, 2])
('bookD', [4])
('bookE', [5])




참고로, itertools 모듈은 나만의 반복자(😊)를 만들 수 있게 해준다. 즉, 뭔가 반복되는 요소를 처리할 경우에 유용하다.


위에서는 itertools의 chain 을 임포트 했는데, 이것은 리스트들을 아주 쉽게 연결해준다.

예)  list(itertools.chain(list1,list2,list3))

list1, list2, list3은 쭈루룩 연결된다. 쮸


재밌어서 연결하는 기능을 좀더 살펴보았다.
압축하는 식으로 리스트를 합칠 수 있는 기능이 있다, izip 인데, 내장함수 zip(iterable*)과 비슷하다.
itertools의 izip 을 임포트하고, 아래와 같이 사용하면 된다.

list(izip([1,2,3],['a','b','c']))


이렇게 하면 두 리스트가 합쳐지고, 요소들이 순서대로 짝이 지어진다. 
즉, [(1,'a'),(2,'b'),(3,'c')] 가 반환된다.
zip()과의 차이점은 iterable 객체를 반환한다는 점 정도.



count(시작점,증가폭)

하면, 시작점부터 증가폭만큼 숫자가 증가한다. 예를 들어 count(0,10) 하면 0부터 10씩 증가하는 수들을 반환함.

예 )
for number, letter in zip(count(0, 10), ['a', 'b', 'c', 'd', 'e']):

    print('{0}: {1}'.format(number, letter))

결과
0: a
10: b
20: c
30: d
40: e







참조 :
https://www.blog.pythonlibrary.org/2016/04/20/python-201-an-intro-to-itertools/
http://hamait.tistory.com/803











Commentaires

Posts les plus consultés de ce blog

[Python] Built-in functions (작성 중)