문자열 목록에서 등거리(equidistant) 연속 문자열, 즉 인접한 문자 간의 아스키 코드 차이가 일정하게 유지되는 문자열을 찾아야 하는 경우가 있습니다. 예를 들어 'abc', 'mpsv'처럼 각 문자가 동일한 간격으로 증가하는 문자열이 대표적입니다.
이러한 조건을 만족하는 문자열을 필터링하려면 리스트 컴프리헨션(list comprehension), 내장 함수 all(), 그리고 문자를 아스키(ASCII) 코드 값으로 변환하는 ord() 메서드를 함께 활용하면 됩니다.
예제 코드
다음은 등거리 연속 문자열을 찾는 방법을 보여주는 예제입니다.
my_list = ["abc", "egfg", "mpsv", "abed", 'xzbd', 'agms']
print("원본 리스트 :")
print(my_list)
my_result = [sub for sub in my_list if all(ord(sub[index + 1]) - ord(sub[index]) == ord(sub[1]) - ord(sub[0]) for index in range(0, len(sub) - 1))]
print("결과 리스트 :")
print(my_result)실행 결과
원본 리스트 : ['abc', 'egfg', 'mpsv', 'abed', 'xzbd', 'agms'] 결과 리스트 : ['abc', 'mpsv', 'agms']
코드 설명
먼저 여러 개의 문자열 값을 담은 리스트를 정의하고 콘솔에 출력합니다.
리스트 컴프리헨션을 사용해 리스트의 각 문자열을 하나씩 순회하며 조건 검사를 수행합니다.
all()함수와ord()메서드를 조합하여, 모든 인접 문자 쌍에 대해 (다음 문자의 아스키 값 − 현재 문자의 아스키 값)이 (두 번째 문자 − 첫 번째 문자)의 차이와 동일한지 확인합니다.모든 인접 문자 간격이 첫 두 문자의 간격과 같다면 해당 문자열은 등거리 연속 문자열이므로 결과 리스트에 포함됩니다.
필터링된 최종 결과는 변수에 저장된 후 콘솔에 출력됩니다.
동작 원리 요약
'abc'의 경우 아스키 코드가 97, 98, 99로 각각 1씩 증가하므로 등거리 문자열입니다. 반면 'egfg'는 문자 간 간격이 일정하지 않아(101→103→102→103) 필터링에서 제외됩니다. 이처럼 ord()로 문자를 정수로 변환한 뒤 차이를 비교하는 방식은 알파벳 시퀀스 검증, 패턴 분석 등 다양한 문자열 처리 문제에 응용할 수 있습니다.