In this tutorial, we are going to write a program that groups all anagrams in a list. First, let's see what are anagrams.
Any two strings that have the same character in a different order are known as anagrams.
Before diving into the solution, let's see an example.
Input
['cat', 'dog', 'fired', 'god', 'pat', 'tap', 'fried', 'tac']
Output
[['cat', 'tac'], ['dog', 'god'], ['fried', 'fired'], ['pat', 'tap']]
We will breakdown the problem into two pieces. First, we will write a function that checks two strings are anagrams or not. Follow the below steps to write code to check anagrams.
- Initialize the strings.
- Sort both the strings.
- If both sorted strings are equal then return True else False.
Example
# 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'))
Output
If you run the above code, then you will get the following result.
True True False
Now, we know how to check two strings whether they are anagrams or not. But, that's not enough to solve our problem. We need to group (store) all the anagrams from a list as sublists.
How can we solve the problem?
It's a best practice to use the dictionaries to group the elements. We will have a single key for related anagrams. It's a bit confusing if you are new to Python. Let's see the steps to achieve what we want.
- Initialize the list of strings.
- Initialize an empty dictionary.
- Iterate over the list.
- Sort the string.
- Check whether it's present in the dictionary or not.
- If it present in the dictionary, then append the string to its list.
- Else initialize the key with a list including the current string to store the anagrams.
- Print all the values of the dictionary in a list.
Example
# 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()))
Output
If you run the above code, then you will get the following result.
[['dog', 'god'], ['pat', 'tap'], ['cat', 'tac'], ['fired', 'fried']]
Conclusion
You can solve the problem using different approaches as well. There a data structure called defaultdict that helps you avoid checking for the key in the dictionary. You can explore it and change the code accordingly.
If you have any doubts in the tutorial, mention them in the comment section.