Todos los Anagramas


Descripción

En un ejercicio previo, creamos una función para verificar si dos cadenas eran anagramas, para esto, ordenamos las letras de ambas palabras y verificamos si las letras ordenadas eran las mismas. Ahora haremos el problema algo más retador.

Escribe un programa que tome una lista de palabras e imprima todos los consjuntos de palabras que son anagramas. Este es un ejemplo de cómo se podría ver la salida del programa:

['deltas', 'desalt', 'lasted', 'salted', 'slated', 'staled']
['retainers', 'ternaries']
['generating', 'greatening']
['resmelts', 'smelters', 'termless']

Consejo: Ordena las letras de cada palabra en la lista de palabras del archivo words.txt, y concatenalas para formar una cadena. Crea un diccionario que asocie la palabra ordenada a una lista de palabras de las cuales es anagrama.

Ejemplo de Ejecución:

anagrams.py

Salida limitada a las últimas 5000 líneas.
['frenetic', 'infecter', 'reinfect']
['frenetics', 'infecters', 'reinfects']
['fresher', 'refresh']
['freshest', 'freshets']
['freshet', 'hefters']
['fret', 'reft', 'tref']
['fretful', 'truffle']
['fretsaw', 'wafters']
['friaries', 'rarifies']
['friary', 'rarify']
['friending', 'infringed', 'refinding']
...

Solución

Mostrar solución
with open('/content/drive/MyDrive/words.txt') as f:
  word_list = f.read().split()

anagrams = {}
for word in word_list:
  key = ''.join(sorted(word))
  if key in anagrams:
    anagrams[key].append(word)
  else:
    anagrams[key] = [word]

for key, value in anagrams.items():
  if len(value) > 1:
    print(value)

Probar solución en Google Colab

Fuente del ejercicio: https://allendowney.github.io/ThinkPython/chap11.html#id3