두 리스트를 합치고 싶을때는 그냥 '+' 연산자를 활용하면 된다.
a=[1,1,2,3,3]
b=[3,4,5]
print(a+b)
#[1,1,2,3,3,3,4,5]
하지만 두 리스트에서 공통된 부분을 삭제해야 할 경우에는 어떻게 해야할까?
그냥 '-' 연산자를 쓰면 될까?
a=[1,1,2,3,3]
b=[3,4,5]
print(a-b)
#TypeError: unsupported operand type(s) for -: 'list' and 'list'
위 처럼 오류가 뜬다. list끼리는 '-' 연산자를 지원하지 않는다.
그렇다면 어떻게 하면될까?
여기서 집합 자료형을 사용할 수 있다.
a=[1,1,2,3,3]
b=[3,4,5]
print(set(a)-set(b))
#{1,2}
print(list(set(a)-set(b)))
#[1,2]
이렇게 집합을 이용하면 두 리스트에서 공통된 부분을 삭제할 수 있다.
그런데 어럽쇼?? 뭔가 이상하다.
분명 a에서 b를 빼면 [1, 1, 2, 3] 이 나와야 하는데 [1, 2] 가 나와버렸다.
이건 집합 자료형이 중복을 허락하지 않기 때문이다.
a=[1,1,2,3,3]
print(set(a))
#{1,2,3}
위에서 보는것 처럼 리스트a를 집합으로 바꿔서 출력하면 중복되는 원소들은 다 삭제가 되는걸 볼 수가 있다.
나는 결과값으로 [1, 1, 2, 3] 을 원하는데...
여기서 등장하는 녀석이 바로 collections 모듈에 들어있는 Counter 클래스이다.
Counter
Counter 클래스는 파이썬에서 항목의 개수를 셀 때 사용한다.
list나 set 을 인자로 넘기면 key값을 각 항목으로 하고, value값을 해당 항목의 개수로 하는 객체를 반환해준다.
사용법을 알아보자.
from collections import Counter
a=[1,1,2,3,3]
print(Counter(a))
#Counter({1: 2, 3: 2, 2: 1})
보는것 처럼 리스트에 있는 각 항목의 수를 세어준다.
리스트 뿐만아니라 집합, 문자열에도 사용할 수 있다.
그럼 아까전에 위에서 하던걸 다시 해 보자.
두 리스트의 공통된 부분을 삭제하는 데에 Counter 클래스를 활용해보자.
from collections import Counter
a=[1,1,2,3,3]
b=[3,4,5]
print(Counter(a)-Counter(b))
#Counter({1: 2, 2: 1, 3: 1})
print(list(Counter(a)-Counter(b)))
#[1,2,3]
print(list((Counter(a)-Counter(b)).elements()))
#[1,1,2,3]
Counter(a)-Counter(b)를 하면 객체에는 Counter({1: 2, 2: 1, 3: 1}) 이런식으로 세팅되어 있다.
두번째 출력값에서 볼 수 있듯이 이 객체를 바로 리스트로 변환해 버리면 키값인 [1, 2, 3]밖에 얻지 못한다.
결과 객체를 elements()로 변환한 뒤에 리스트로 변환하면 원하고자 하는 결과값인 [1, 1, 2, 3]을 얻을 수 있다.
defaultdict
defaultdict 그리고 setdefault 는 여기 에 따로 게시해 놨으니 참고하길 바란다.
'알고리즘 > Python 문법' 카테고리의 다른 글
[Python] 딕셔너리의 기본값 처리 (defaultdict) (0) | 2021.02.04 |
---|