문자열 연산에 대한 파이썬 프로그램
게시 됨: 2022-04-26이 자습서에서는 문자열 작업 에 대해 자주 묻는 질문을 해결하는 Python 프로그램을 작성합니다.
Python 문자열이 회문 , anagrams 및 제목 케이스 에 있는지 확인하는 방법을 배웁니다.
Python 문자열: 빠른 검토
Python에서 문자열은 강력한 내장 데이터 유형입니다. 일련의 문자를 저장할 수 있습니다.
Python 문자열의 인덱싱: 모든 Python iterable과 마찬가지로 문자열도 0으로 인덱싱됩니다. 따라서 길이가 N인 문자열에 대한 유효한 인덱스는 0, 1, 2에서 N – 1까지입니다.
Python은 또한 문자열 끝에서 요소에 액세스하기 위해 음수 인덱싱을 지원합니다. 따라서 -1은 문자열의 마지막 문자 인덱스이고 -2는 문자열의 마지막에서 두 번째 문자 인덱스 등입니다.
Python 문자열의 불변성 : 또한 Python의 문자열은 변경할 수 없으므로 제자리에서 수정할 수 없습니다. 그러나 여기에 대해 여러 문자열 메서드를 호출하고 원하는 결과로 문자열 복사본을 얻을 수 있습니다.
이제 Python 문자열의 기본 사항을 검토했으므로 간단하면서도 흥미로운 문제를 해결해 보겠습니다.
시작하자.
Python 문자열이 회문인지 확인
문제 : 파이썬 문자열이 주어지면 그것이 회문인지 아닌지 확인하십시오.
그렇다면 True를 반환합니다. 그렇지 않으면 False를 반환합니다.
따라서 우리의 첫 번째 문제는 주어진 문자열이 회문인지 여부를 확인하는 것입니다.
회문 은 왼쪽에서 오른쪽으로, 오른쪽에서 왼쪽으로 읽는 문자열입니다. 몇 가지 예를 나열해 보겠습니다. racecar, 참조, 레벨, 마담, 레이더 등.
이 문제를 해결하는 단계는 다음과 같습니다.
- 문자열의 역 복사본 을 얻고 필요한 경우 다른 변수에 저장합니다.
- 원래 문자열과 반전된 문자열의 값을 비교합니다.
- 그들이 같으면 문자열은 회문입니다. 따라서 True 를 반환하고 중지합니다.
- 원본과 반전된 복사본이 같지 않으면 문자열은 회문이 아닙니다. 따라서 False 를 반환해야 합니다.
핵심 작업은 문자열의 반전된 복사본을 얻는 것입니다. Python에서는 이를 수행할 수 있는 몇 가지 다른 방법이 있습니다.
그러나 다음 두 가지 접근 방식을 살펴보겠습니다.
- 문자열 슬라이싱 사용
- reversed() 함수와 join() 메서드 사용
슬라이싱을 사용하여 Python 문자열을 뒤집는 방법
구문 <any_str>[start: stop: step]
은 단계 크기가 step
인 start
stop
까지 포함하지 않는 문자열 <any_str>
조각을 반환합니다.
-
start
를 생략하면 슬라이스가 문자열의 시작 부분에서 시작됩니다. -
stop
인덱스를 지정하지 않으면 슬라이스가 문자열 끝까지 확장됩니다. - 그리고
step
의 음수 값은 문자열의 끝에서 시작하는 슬라이스를 반환하는 데 사용할 수 있습니다.
따라서 <any_str>[::-1]
은 문자열의 반전된 복사본을 반환합니다.
다음 코드 셀에는 is_palindrome()
함수의 정의가 포함되어 있습니다.
문자열을 인수로 받아 회문인지 여부에 따라 True
또는 False
를 반환합니다.
여기에서 문자열의 역 복사본을 얻기 위해 문자열 슬라이싱을 사용했습니다.
def is_palindrome(this_str): rev_str = this_str[::-1] if (this_str == rev_str): return True else: return False
️ 이제 함수를 정의했으므로 유효한 문자열을 인수로 사용하여 호출할 수 있습니다.
is_palindrome("racecar") True
위의 코드 셀에서 racecar
는 회문입니다. 따라서 is_palindrome()
함수는 예상대로 True
를 반환합니다.
이제 river
와 같이 회문이 아닌 문자열로 함수를 호출해 보십시오.
is_palindrome("river") False
그리고 보시 False
를 반환합니다. 이는 정확합니다.
reversed() 및 join()을 사용하여 Python 문자열을 뒤집는 방법
Python에서는 reversed()
함수와 함께 join()
메서드를 사용하여 문자열을 뒤집을 수 있습니다.
-
reversed()
함수는 문자열의 문자를 통해 역방향 반복기를 반환합니다. - 그런 다음
join()
메서드를 사용하여 해당 문자를 역순으로 결합할 수 있습니다.
위의 방법을 사용하여 is_palindrome()
함수를 아래 코드 셀과 같이 다시 작성할 수 있습니다.
def is_palindrome(this_str): rev_str = ''.join(reversed(this_str)) if (this_str == rev_str): return True else: return False
목록 이해 내에서 is_palindrome()
함수를 사용하여 더 긴 문자열 목록에서 모든 회문을 수집할 수도 있습니다.
str_list = ["refer","blue","level","12321","dragon"] palindromes = [string for string in str_list if is_palindrome(string)] print(palindromes) # Output ['refer', 'level', '12321']
위의 코드가 작동하는 방식은 다음과 같습니다.
-
str_list
를 통해 트래버스하고 각 문자열에서is_palindrome()
을 호출합니다. -
is_palindrome()
이True
를 반환하면 문자열을palindromes
목록에 추가합니다.
위의 출력에서 볼 수 있듯이 palindromes
은 str_list
의 모든 회문 문자열 목록입니다.
두 개의 Python 문자열이 아나그램인지 확인
인터뷰에서 접할 수 있는 또 다른 인기 있는 질문은 str1
및 str2
문자열 쌍이 아나그램인지 여부를 확인하는 것입니다.
두 문자열의 문자 수가 정확히 같으면 두 문자열을 아나그램 이라고 합니다. 즉, 다른 문자열의 문자를 치환 하거나 재배열 하여 문자열 중 하나를 얻을 수 있습니다.
아나그램의 예로는 state-taste, save-vase, 팔꿈치 아래 등이 있습니다.
Python에서 카운터 객체를 사용하여 아나그램을 확인하는 방법
간단하고 직관적인 방법은 두 문자열에서 각 문자의 발생 횟수를 계산하는 것입니다. 그런 다음 개수가 동일한지 확인합니다.
itertools
모듈의 Counter
객체를 사용하면 훨씬 더 쉽게 할 수 있습니다. Counter 객체는 Python 사전을 반환합니다. 문자는 키로 , 해당 개수는 값 으로 사용합니다.
아래와 같이 "save"
및 "vase"
문자열을 고려하십시오.
str1 = "save" str2 = "vase"
여기에서 c1
및 c2
는 각각 문자열 str1
및 str2
의 문자 수를 포함하는 카운터 객체입니다.
from collections import Counter c1 = Counter(str1) c2 = Counter(str2) print(c1) print(c2) c1 == c2 # Output Counter({'s': 1, 'a': 1, 'v': 1, 'e': 1}) Counter({'v': 1, 'a': 1, 's': 1, 'e': 1}) True
c1 == c2
는 str1
과 str2
가 아나그램이므로 True
를 반환합니다.
이 논리를 사용하여 이제 두 개의 매개변수 word1
과 word2
를 사용하여 are_anagrams()
함수를 정의할 수 있습니다. 함수 본문에서 Counter(word1) == Counter(word2)
인지 확인합니다.
def are_anagrams(word1, word2): if Counter(word1) == Counter(word2): return True else: return False
️ 확인하려면 str1
, str2
를 인수로 사용하여 are_anagrams()
를 호출하십시오. str1
과 str2
는 아나그램("save" 및 "vase")이므로 함수는 True
를 반환합니다.
are_anagrams(str1, str2) True
정렬된 문자열 복사본을 사용하여 아나그램을 확인하는 방법
이 작업을 수행할 수 있는 다른 방법이 있습니다.
두 문자열이 아나그램이면 정렬된 복사본 이 동일합니다.
따라서 우리는 함수 are_anagrams()
를 다시 작성하여 str1
의 정렬된 버전이 str2
의 정렬된 복사본과 동일한지 확인할 수 있습니다. 동일하면 두 문자열은 아나그램입니다. 그렇지 않으면 그렇지 않습니다.
위의 방법을 사용하여 정렬된 복사본의 동등성을 확인하면 다음과 같이 are_anagrams()
함수를 다시 작성할 수 있습니다.
def are_anagrams(word1, word2): if sorted(word1) == sorted(word2): return True else: return False
이제 몇 가지 함수 호출을 해보자.
- "elbow" 및 "below" 문자열은 아나그램이며
are_anagrams()
함수는True
를 반환합니다. - 그리고 "state"와 "tasted"는 아나그램이 아니며 함수는
False
를 반환합니다.
are_anagrams("below","elbow") True are_anagrams("state","tasted") False
Python 문자열이 제목 대소문자에 있는지 확인
이 튜토리얼의 마지막 질문은 다음과 같습니다.
문제 : 주어진 문자열: 사람의 이름 - 이름과 성을 포함합니다.
이름과 성의 첫 글자가 모두 대문자인지 확인해야 합니다.
각 단어의 첫 글자가 대문자인 이러한 유형의 대/소문자를 제목 대/소문자 라고 합니다.
따라서 이름이 제목 대소문자에 있는지 확인해야 합니다.
1. 그렇다면 형식이 제목 대소문자에 있다는 메시지를 출력합니다.
2. 그렇지 않으면 제목 케이스에 서식이 지정된 문자열의 복사본을 반환합니다.
- Python에는 문자열이 제목 대소문자에 있는지 여부를 확인하는 내장 문자열 메서드
istitle()
이 있습니다.
<str>.istitle()
은 문자열<str>
이 제목의 형식이면True
를 반환하고, 그렇지 않으면False
를 반환합니다.
- 그리고 Python의 문자열 메서드
title()
은 제목 케이스에 서식이 지정된 문자열의 복사본을 반환합니다.
이제 이 두 가지 방법을 사용하여 문제를 해결할 수 있습니다.
name
을 인수로 받아들이는 함수 check_titlecase()
를 정의합니다.
- 입력 문자열에서
istitle()
메서드를 호출하여 제목 대소문자 형식이 지정되었는지 확인할 수 있습니다. -
True
이면 문자열이 이미 제목 대소문자를 사용하고 있음을 인쇄할 수 있습니다. - 그렇지 않으면
title()
메서드를 호출하고 제목의 경우 문자열의 복사본을 반환할 수 있습니다.
다음 코드 셀은 check_titlecase()
함수의 정의를 보여줍니다.
def check_titlecase(name): if name.istitle(): print(f"'{name}' is already formatted in title case.") else: return name.title()
이제 인수를 사용하여 check_titlecase()
메서드를 호출해 보겠습니다.
check_titlecase("jane smith") # Output Jane Smith
위의 출력에서 "Jane Smith"라는 문자열이 이제 제목 케이스에 있는 것을 볼 수 있습니다.
️ 다른 예를 들어보겠습니다.
check_titlecase("agatha Christie") # Output Agatha Christie
이번에는 제목이 대문자인 문자열로 함수를 호출해 보겠습니다.
check_titlecase("Grace Hopper") # Output 'Grace Hopper' is already formatted in title case.
문자열이 제목 형식으로 지정되었다는 알림을 받고 함수가 예상대로 작동합니다.
결론
이제 지금까지 논의한 문제를 요약해 보겠습니다.
- 문자열이 회문인지 확인하려면 문자열과 그 반대 버전이 동일한지 확인합니다. 문자열 슬라이싱 또는 내장 메소드를 사용하여 문자열을 반전시킬 수 있습니다.
- 두 문자열이 아나그램인지 확인하려면 정렬된 복사본이 동일한지 확인합니다. 그리고 문자열을 정렬하려면 내장된 sorted() 함수를 사용하십시오.
- 이름이 제목 대소문자인지 확인하려면 .istitle() 메서드 를 사용하여 확인하고 .title() 메서드를 사용하여 문자열의 제목 대소문자 복사본을 가져옵니다.
파이썬 문자열에 대한 이 튜토리얼을 즐겼기를 바랍니다. 다음 단계로 Python에서 목록 이해를 사용하는 방법을 배우거나 Python의 같지 않음 연산자에 대해 알아보세요.
즐거운 학습과 코딩!