patternpythonMinor
Simple anagram or permutation generator in Python
Viewed 0 times
simplegeneratoranagrampythonpermutation
Problem
In preparation for a job interview I decided to try and implement the classic find all anagrams of a given string solution. I wanted to see if I could translate a javascript solution into python. This was my attempt:
def anagrams(word):
if len(word) < 2:
return word
else:
tmp = []
for i, letter in enumerate(word):
for j in anagrams(word[:i]+word[i+1:]):
tmp.append(j+letter)
return tmp
if __name__ == "__main__":
print anagrams("abc")Solution
Your python code is neat, simple and easy to understand (so generally it's good); and yet, something in me doesn't like the use of so many temporary arrays. How about using a generator?
I (now) filtered out all duplicates which is almost certain your original intention and is standard in all anagram problems. I did this by seeing if the same letter was already earlier in the word in which case we will have already generated this anagram.
You would have to do the same, or get rid of duplicates in your list for example by doing
instead of your current return from anagrams.
def anagrams(word):
""" Generate all of the anagrams of a word. """
if len(word) < 2:
yield word
else:
for i, letter in enumerate(word):
if not letter in word[:i]: #avoid duplicating earlier words
for j in anagrams(word[:i]+word[i+1:]):
yield j+letter
if __name__ == "__main__":
for i in anagrams("acbcddd"):
print iI (now) filtered out all duplicates which is almost certain your original intention and is standard in all anagram problems. I did this by seeing if the same letter was already earlier in the word in which case we will have already generated this anagram.
You would have to do the same, or get rid of duplicates in your list for example by doing
return list(set(tmp))instead of your current return from anagrams.
Code Snippets
def anagrams(word):
""" Generate all of the anagrams of a word. """
if len(word) < 2:
yield word
else:
for i, letter in enumerate(word):
if not letter in word[:i]: #avoid duplicating earlier words
for j in anagrams(word[:i]+word[i+1:]):
yield j+letter
if __name__ == "__main__":
for i in anagrams("acbcddd"):
print ireturn list(set(tmp))Context
StackExchange Code Review Q#52038, answer score: 6
Revisions (0)
No revisions yet.