본문 바로가기

알고리즘/Python 문법

[Python] 딕셔너리의 기능들

두 리스트를 합치고 싶을때는 그냥 '+' 연산자를 활용하면 된다.

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 는  여기 에 따로 게시해 놨으니 참고하길 바란다.