Skip to content

Instantly share code, notes, and snippets.

@renzon
Last active December 5, 2015 02:54
Show Gist options
  • Save renzon/ae7a323f87299f18da7c to your computer and use it in GitHub Desktop.
Save renzon/ae7a323f87299f18da7c to your computer and use it in GitHub Desktop.
code for detecting anagrams with tests
from collections import Counter
from unittest.case import TestCase
def is_anagram(word1, word2):
def extract_counter(word):
counter = Counter(filter(lambda char: char != ' ', word))
return counter
counter1 = extract_counter(word1)
counter2 = extract_counter(word2)
return counter1 == counter2
class AnagramTests(TestCase):
def test_ignoring_empty_char(self):
self.assertTrue(is_anagram(' ', ''))
self.assertTrue(is_anagram('a', ' a '))
self.assertTrue(is_anagram(' a', ' a '))
self.assertTrue(is_anagram(' a ', ' a '))
def test_not_anagrams(self):
self.assertFalse(is_anagram(' ', 'a'))
self.assertFalse(is_anagram('a', ' ab'))
self.assertFalse(is_anagram(' a', ' ca'))
self.assertFalse(is_anagram('aa', 'ab'))
self.assertFalse(is_anagram('aa', 'aac'))
def test_palindromes(self):
'''
Palindrome is a very special case of anagram
where one word is equals to other reversed
:return:
'''
self.assertTrue(is_anagram('a', 'a'))
self.assertTrue(is_anagram('ba', ' ab '))
self.assertTrue(is_anagram('Roma me tem amor', 'roma met em amoR'))
def test_anagrams_with_3_different_chars(self):
self.assertTrue(is_anagram('abc', 'abc'))
self.assertTrue(is_anagram('abc', 'acb'))
self.assertTrue(is_anagram('abc', 'bac'))
self.assertTrue(is_anagram('abc', 'bca'))
self.assertTrue(is_anagram('abc', 'cab'))
self.assertTrue(is_anagram('abc', 'cba'))
def test_anagrams_with_repeated_chars(self):
self.assertTrue(is_anagram('aac', 'aac '))
self.assertTrue(is_anagram('aac', 'aca '))
self.assertTrue(is_anagram('aac', ' caa '))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment