Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python – 문자열의 각 문자 빈도를 구하고 모두 다른지 확인하는 방법

이 글에서는 주어진 문자열에서 각 문자가 몇 번 등장하는지 그 빈도를 구하는 방법을 알아봅니다. 이어서 두 개 이상의 문자가 서로 같은 빈도를 가지는지, 즉 모든 문자의 빈도가 서로 다른지 여부까지 확인해 보겠습니다. 전체 과정은 두 단계로 진행되며, 첫 번째 프로그램에서는 각 문자의 빈도만 계산합니다.

각 문자의 빈도 구하기

먼저 입력 문자열에 포함된 각 문자의 등장 횟수를 계산합니다. 빈 딕셔너리(dictionary)를 하나 선언한 뒤, 문자열을 한 글자씩 순회하면서 해당 문자를 키(key)로 사용하고 등장 횟수를 값(value)으로 저장하는 방식입니다. 이미 존재하는 키라면 값을 1씩 증가시키고, 없다면 새로운 키-값 쌍을 추가합니다.

예제

in_string = "She sells sea shells"
dic1 = {}
for k in in_string:
    if k in dic1.keys():
        dic1[k]+=1
    else:
        dic1[k]=1
print(dic1)
for k in dic1.keys():
    print(k, " repeats ",dic1[k]," time's")

실행 결과

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

{'S': 1, 'h': 2, 'e': 4, ' ': 3, 's': 5, 'l': 4, 'a': 1}
S repeats 1 time's
h repeats 2 time's
e repeats 4 time's
  repeats 3 time's
s repeats 5 time's
l repeats 4 time's
a repeats 1 time's

결과를 보면 'S'는 1번, 'h'는 2번, 'e'는 4번 등 각 문자별 등장 횟수가 딕셔너리 형태로 깔끔하게 정리됩니다. 공백 문자 역시 하나의 키로 처리된다는 점에 유의하세요.

각 문자의 빈도가 모두 고유한지 확인하기

이제 위 프로그램을 확장하여 문자열에 등장하는 빈도 값들 중 고유한(unique) 값이 몇 개인지 확인합니다. 집합(set)을 사용하면 중복을 제거한 빈도 목록을 손쉽게 얻을 수 있습니다. 만약 고유한 빈도 값이 하나뿐이라면 모든 문자의 빈도가 같다는 의미이고, 그렇지 않다면 최소 두 개 이상의 문자가 서로 다른 빈도를 가진다는 뜻입니다.

예제

in_string = "She sells sea shells"
dic1 = {}
for k in in_string:
    if k in dic1.keys():
        dic1[k]+=1
    else:
        dic1[k]=1
print(dic1)
u_value = set( val for udic in dic1 for val in (dic1.values()))
print("Number of Unique frequencies: ",len(u_value))
if len(u_value) == 1:
    print("All character have same frequiency")
else:
    print("The characters have different frequencies.")

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

{'S': 1, 'h': 2, 'e': 4, ' ': 3, 's': 5, 'l': 4, 'a': 1}
Number of Unique frequencies: 5
The characters have different frequencies.

예제 문자열에서는 1, 2, 3, 4, 5처럼 총 5개의 서로 다른 빈도 값이 존재하므로 "문자들의 빈도가 서로 다릅니다"라는 메시지가 출력됩니다. 반대로 고유한 빈도의 개수가 1이라면 "모든 문자의 빈도가 같습니다"라는 결과를 얻게 됩니다.

참고: collections.Counter로 더 간결하게

파이썬에서는 표준 라이브러리의 collections.Counter를 활용하면 위의 반복문 없이도 문자 빈도를 한 줄로 계산할 수 있어 코드가 훨씬 간결해집니다.

from collections import Counter

in_string = "She sells sea shells"
counter = Counter(in_string)
print(counter)

unique_freq = set(counter.values())
if len(unique_freq) == 1:
    print("All characters have the same frequency")
else:
    print("Number of Unique frequencies: ", len(unique_freq))
    print("The characters have different frequencies.")

Counter는 문자열을 순회하며 자동으로 각 문자의 개수를 세어 주므로, 실무에서는 이 방식을 사용하는 것이 가독성과 성능 면에서 모두 유리합니다.