이 튜토리얼에서는 목록의 모든 아나그램을 그룹화하는 프로그램을 작성할 것입니다. 먼저 애너그램이 무엇인지 알아보겠습니다. .
같은 문자가 다른 순서로 포함된 두 문자열을 아나그램이라고 합니다.
솔루션에 대해 알아보기 전에 예를 살펴보겠습니다.
입력
['cat', 'dog', 'fired', 'god', 'pat', 'tap', 'fried', 'tac']
출력
[['cat', 'tac'], ['dog', 'god'], ['fried', 'fired'], ['pat', 'tap']]
우리는 문제를 두 부분으로 나눌 것입니다. 먼저 두 문자열이 아나그램인지 확인하는 함수를 작성합니다. 아래 단계에 따라 아나그램을 확인하는 코드를 작성하십시오.
- 문자열을 초기화합니다.
- 두 문자열을 모두 정렬합니다.
- 정렬된 두 문자열이 모두 같으면 True를 반환합니다. else 거짓 .
예시
# simple lambda function to check whether two strings are anagrams or not are_anagrams = lambda x, y: str(sorted(x.lower())) == str(sorted(y.lower())) # calling the function print(are_anagrams('cat', 'tac')) print(are_anagrams('cat', 'Tac')) print(are_anagrams('cat', 'dog'))
출력
위의 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
True True False
이제 우리는 두 문자열이 아나그램인지 아닌지 확인하는 방법을 알고 있습니다. 그러나 그것만으로는 우리의 문제를 해결할 수 없습니다. 목록의 모든 아나그램을 하위 목록으로 그룹화(저장)해야 합니다.
문제를 어떻게 해결할 수 있습니까?
사전을 사용하여 요소를 그룹화하는 것이 가장 좋습니다. 관련 아나그램에 대한 단일 키가 있습니다. Python을 처음 사용하는 경우 약간 혼란스럽습니다. 원하는 것을 달성하기 위한 단계를 살펴보겠습니다.
- 문자열 목록을 초기화합니다.
- 빈 사전을 초기화합니다.
- 목록을 반복합니다.
- 문자열을 정렬합니다.
- 사전에 있는지 확인하세요.
-
- 사전에 존재하는 경우 문자열을 목록에 추가합니다.
- 그렇지 않으면 아나그램을 저장할 현재 문자열을 포함하는 목록으로 키를 초기화합니다.
- 사전의 모든 값을 목록으로 인쇄합니다.
예시
# initialzing a list of strings anagrams = ['cat', 'dog', 'fired', 'god', 'pat', 'tap', 'fried', 'tac'] # initializing an empty dict grouped_anagrams = {} # iterating over the list to group all anagrams for string in anagrams: # sorting the string sorted_string = str(sorted(string)) # checking the string in dict if sorted_string in grouped_anagrams: # adding the string to the group anagrams grouped_anagrams[sorted_string].append(string) else: # initializing a list with current string grouped_anagrams[sorted_string] = [string] # printing the values of the dict (anagram groups) print(list(grouped_anagrams.values()))
출력
위의 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
[['dog', 'god'], ['pat', 'tap'], ['cat', 'tac'], ['fired', 'fried']]
결론
다른 접근 방식을 사용하여 문제를 해결할 수도 있습니다. defaultdict라는 데이터 구조가 있습니다. 사전에서 키를 확인하는 것을 방지하는 데 도움이 됩니다. 탐색하고 그에 따라 코드를 변경할 수 있습니다.
튜토리얼에서 의문점이 있으면 댓글 섹션에 언급하세요.