Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Programa que verifica se um arquivo texto contem anagramas de uma dada palavra

Implemente a função anagrama(), que calcula anagramas de determinada palavra. Um anagrama da palavra A é uma palavra B que pode ser formada rearrumando as letras de A. Por exemplo, a palavra “pot” é um anagrama da palavra “top”. Sua função tomará como entrada o nome de um arquivo de palavras e também uma palavra, e exibirá todas as palavras no arquivo que sejam anagramas da palavra informada. Nos próximos exemplos, use o arquivo words.txt como seu arquivo de palavras.

Arquivo: words.txt

Arquivo: https://easyupload.io/bl4w3d

>>> anagrams('words.txt', 'trace')
crate
cater
react

O que eu fiz:

def permutations(lst):
    if not lst:
        return [[]]
    res = []
    for e in lst:
        temp = lst[:]
        temp.remove(e)
        res.extend([[e] + r for r in permutations(temp)])

    return res

def anagrama(file, palavra):

    lista = permutations(list(palavra))
    pal =""
    anas = []

    for i in lista:
        for j in i:
            pal +=j
        anas.append(pal)
        pal =""

    print(anas)# lista de anagramas
    with open(file) as f:
        for palavra  in f:
            #print(palavra)
            while palavra in anas:
                print(palavra)


anagrama("words.txt", "trace")

Aparentemente, a parte que verifica se alguma palavra no arquivo está na lista de anagramas não funciona:

for palavra  in f:
            #print(palavra)
            while palavra in anas:

                print(palavra)

Como corrigir? O que eu fiz de errado?

1 resposta
solução!

Olá Edson.No estado atual do seu código o f do trecho (for palavra in f:) está retornando uma lista com os nomes do arquivo words.txt, porem os nomes estão vindo com um carácter a mais o '\n' que representa a quebra de linha então os nomes quando comparados com as palavras na lista anas não são iguais. Por exemplo crate\n é diferente de crate e dessa maneira o código nunca imprime as palavras que são na verdade iguais.

for palavra  in f:
    #print(palavra)
    while palavra in anas:
        print(palavra)

A solução que fiz foi usar o método read() para pegar as palavras do arquivo em uma string e depois usar o método split('\n') para criar uma lista a partir das palavras que estão separadas pela quebra de linha \n, dessa maneira teremos uma lista que contem os elementos sem o carácter a mais.

for palavra  in f.read().split('\n'):

Ha uma questão com a logica do while também, da maneira que está ele fica em loop porque por exemplo quando a variável palavra tiver o valor crate que está contida na lista anas esse while será verdadeiro e não há nada no código que mude isso.

while palavra in anas:
    print(palavra)

Uma alternativa que encontrei foi remover a palavra da lista dessa maneira anas.remove(palavra), assim ele vai conseguir sair do while. O código final ficou como abaixo:

#print(anas)# lista de anagramas
with open(file) as f:
for palavra  in f.read().split('\n'):
    #print(palavra)
    while palavra in anas:
        anas.remove(palavra)
        print(palavra)

Espero ter ajudado, mas qualquer duvida estou a disposição.Abraços.