Backend/Python

중복값 갯수(collections.Counter)

비비빅B 2020. 5. 2. 18:49

빈 Dictionary 이용:

words = "a b c d a c"
word_list = words.split()	# ['a', 'b', 'c', 'd', 'a', 'c']

dict = {}	#빈 딕셔너리
for word in word_list:
	if word in dict:		# 이미 있는 키
		dict[word] += 1
	else:					# 처음 보는 키
		dict[word] = 1

for key,value in dict.items():
	print("{}: {}개".format(key, value), end=" ")	# a: 2개 b: 1개 c: 2개 d: 1개
  • 리스트에서 중복되는 값의 갯수를 알고 싶을 때, 값을 split()로 나눈 후 빈 딕셔너리 생성

  • 이미 있는 경우, 없는 경우로 나눠서 갯수를 세렸다.


 

Counter 이용:

from collections import Counter
word_item = Counter(word_list)

for key,value in word_item.items():
	print("{}: {}개".format(key, value))		# a: 2개 b: 1개 c: 2개 d: 1개
  • 제일 위에 collections 모듈에서 Counter 클래스를 import

  • 처음보는 키, 이미 있는 키로 나눠서 빈 딕셔너리에 담았던 절차를 알아서 해줌


word_item.items()	# dict_items([('a', 2), ('b', 1), ('c', 2), ('d', 1)])
word_item.keys()	# dict_keys(['a', 'b', 'c', 'd'])
word_item.values()	# dict_values([2, 1, 2, 1])
  • Counter 자료의 형태는 dictionary형태

  • items, values, keys도 사용 가능


Counter로 자료 추가:

x = Counter(a=2, b=4, c=2)			# Counter({'b': 4, 'a': 2, 'c': 2})

y = Counter() y.update('aabbbbcc')	# Counter({'b': 4, 'a': 2, 'c': 2})
  • 위와 같은 방식으로도 자료를 추가 가능

  • 기본적으로 Counter는 갯수를 세리는 클래스이므로 추가한 자료는 key별로 나눠 value를 갯수로 가짐

  • 기본적으로 정렬은 value 내림차순이 디폴트

  • 'a'를 먼저 넣어도 value가 큰 순서대로 정렬


Counter 연산:

x= Counter('abcd')
y= Counter('abcf')

result = x-y	# Counter({'d': 1})
x.subtract(y)	# Counter({'d': 1, 'a': 0, 'b': 0, 'c': 0, 'f': -1})
  • Counter 함수는 연산이 가능한데 더하기, 빼기가 가능

  • subtract도 있는데 이 메소드를 이용하면 0과 음수값을 가질 수도 있다는 점에서 빼기랑 다름

  • 빼기는 0, 음수 값을 가진 결과는 데이터로 가지지 않음

  • 이외에도 교집합 합집합 빈도수를 구할 수도 있음