Wyrazy wzajemnie odwrotne w liście

0

Mam do napisania program który wyszukuje i wypisuje wyrazy wzajemnie odwrotne. I napisałem lecz mam problem, jeżeli w liście pojawia się wyraz, który jest palindromem to mój program nie działa poprawnie. Jakieś pomysły jak to naprawić?
Parę wyrazów nazwiemy wzajemnie odwrotnymi, jeżeli pierwszy z nich jest równy drugiemu przeczytanemu wspak.

def reverse_words(words):
    length = 0
    reverse = []
    while length < len(words):
        reverse.append(words[length][::-1])
        length += 1
    reverse = set(reverse)
    words = set(words)
    tmp = words - reverse
    tmp = tmp ^ words
    printing(tmp)

def printing(set_of_words):
    list = []
    list.extend(set_of_words)
    while len(list) > 0:
        print(list[0]," - ", list[0][::-1])
        word2 = list[0]
        word3 = list[0][::-1]
        list.remove(word2)
        list.remove(word3)

words = [ 'kot', 'tok', 'ac', 'ba', 'marcin', 'adam', 'mada','a']

reverse_words(words)

Tak jak w tej liście wyrazów pojawia się 'a' to wywala mi błąd, jak to mogę rozwiązać? Póki co robię to na zasadzie, że odwracam te wyrazy z listy i wrzucam do 2 listy następnie wyszukuję ich część wspólną, a później wypisuje parę wyrazów i je usuwam z list.
Zależy mi na wydajności więc pętla w pętli odpada.

1

Palindromy w Pythonie łatwo poznać , if slowo == slowo[::-1]: dodawaj je do drugiej listy albo wracaj do while-a zależy czy mają być uwzględniane czy też nie. Swoją drogą przekombinowałeś, łap

def odwrotne(lista):
	odwrocone = list()
	for slowo in lista:
		if slowo != slowo[::-1]:
			odwrocone.append(slowo[::-1])
			lista.remove(slowo)
	lista, odwrocone = set(lista), set(odwrocone)
	tymcz = lista - (lista - odwrocone)
	for slowo in tymcz:
		print(slowo[::-1], " - ", slowo)


odwrotne([ 'kot', 'tok', 'ac', 'ba', 'marcin', 'adam', 'mada','a', 'kajak'])
0

Możesz to zrobić bardziej pythonicznie (dwa onelinery)

>>> s = set(words); filter(lambda x: x[::-1] in s, words)
['kot', 'tok', 'adam', 'mada', 'a']
>>> set(words).intersection(map(lambda x: x[::-1], words))
set(['a', 'tok', 'adam', 'kot', 'mada'])
0

Ogólnie to ma działać dla danych z pliku więc robię wczytywanie:

new = []
file = open('slowa.txt', encoding="utf8").read()
lines = file.split()
for line in lines:
    new.append(line)

I wysyłam:

odwrotne(new)

I to się strasznie długo robi można to jakoś inaczej zrobić lub przyspieszyć ?
Podrzucam link do danych: http://www22.zippyshare.com/v/2idMpzLr/file.html

0

Co się ma pojawić na wyjściu, gdy wejście wygląda tak: ['tok','kot','pies','kot',tok']?
['tok','kot','kot',tok'] czy ['tok','kot']

0
d = dict()
file = open('slowa.txt').read()
lines = file.split()
for word in lines:
    if d.has_key(word[::-1]):
        d[word[::-1]] = d[word[::-1]] - 1
    elif not d.has_key(word):
        d[word] = 1
       
for key in d.keys():
    if d[key] == 0:
        print(key)

U mnie program (łącznie z wypisaniem) wykonuje się około 5 sekund. Wypisuje również palindromy, prosta modyfikacja ostatniej pętli pozwala pominąć palindromy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1