[Python] 리스트에서 원소별 개수를 세서 Dictionary를 만들고, 개수 상위 n개 가져오기
Python 분석과 프로그래밍/Python 데이터 전처리 2021. 11. 17. 15:50Word counts 할 때 많이 사용하는 코드인데요, 이번 포스팅에서는
(1) 리스트에서 원소별 개수를 세서 {Key:Value} 쌍의 Dictionary를 만들고
(2) 원소별 개수를 세어놓은 Dictionary에서 개수 상위 n 개의 {Key:Value} 쌍을 가져오기
하는 방법을 소개하겠습니다.
(1) 리스트에서 원소별 개수를 세서 {Key:Value} 쌍의 Dictionary를 만들기
먼저, 예제로 사용할 간단한 리스트를 만들어보겠습니다.
## creating sample lists
my_list = ['a', 'f', 'a', 'b', 'a', 'a', 'c', 'b',
'c', 'e', 'a', 'c', 'b', 'f', 'c']
print(my_list)
# ['a', 'f', 'a', 'b', 'a', 'a', 'c', 'b', 'c', 'e', 'a', 'c', 'b', 'f', 'c']
다음으로, 원소별 개수를 세서 저장할 비어있는 Dictionary 인 counts={} 를 만들어놓고, for loop 순환문으로 리스트의 원소를 하나씩 순서대로 가져다가 Dictionary counts 의 Key 값에 해당 원소가 들어있으면 +1을 하고, Key 값에 해당 원소가 안들어 있으면 해당 원소를 Key 값으로 등록하고 1 을 값으로 입력해 줍니다.
def get_counts(seq):
counts = {}
for x in seq:
if x in counts:
counts[x] += 1
else:
counts[x] = 1
return counts
counts = get_counts(my_list)
print(counts)
# {'a': 5, 'f': 2, 'b': 3, 'c': 4, 'e': 1}
## access value by key
counts['a']
# 5
(2) 원소별 개수를 세어놓은 Dictionary에서 개수 상위 n 개의 {Key:Value} 쌍을 가져오기
Dictionary를 정렬하는 방법에 따라서 두 가지 방법이 있습니다.
(a) sorted() 메소드를 이용해서 key=lambda x: x[1] 로 해서 정렬 기준을 Dictionary의 Value 로 하여 내림차순으로 정렬(reverse=True) 하고, 상위 n 개까지만 슬라이싱해서 가져오는 방법입니다.
## way 1
## reference: https://rfriend.tistory.com/473
def top_n(count_dict, n=3):
return sorted(count_dict.items(), reverse=True, key=lambda x: x[1])[:n]
## getting top 2
top_n(counts, n=2)
# [('a', 5), ('c', 4)]
(b) 아래는 dict.items() 로 (Key, Value) 쌍을 for loop 문을 돌리면서 (Value, Key) 로 순서를 바꿔서 리스트 [] 로 만들고 (list comprehension), 이 리스트에 대해서 sort(reverse=True) 로 Value 를 기준으로 내림차순 정렬한 후에, 상위 n 개까지만 슬라이싱해서 가져오는 방법입니다.
## way2
## reference: https://rfriend.tistory.com/281
def top_n2(count_dict, n=3):
val_key = [(v, k) for k, v in count_dict.items()]
val_key.sort(reverse=True)
return val_key[:n]
## getting top 2
top_n2(counts, n=2)
# [(5, 'a'), (4, 'c')]
[Reference]
* Dictionary 정렬: https://rfriend.tistory.com/473
* List 정렬: https://rfriend.tistory.com/281
이번 포스팅이 많은 도움이 되었기를 바랍니다.
행복한 데이터 과학자 되세요.