for word1 in fin
выполняет итерацию построчно, поэтому word1
- это строка, а не слово.Это то, что вы намеревались?
for word2 in fin
использует тот же итератор, поэтому я думаю, что он будет использовать все входные данные, и for word1 in fin
будет сделано только один раз.
Так что самый простойизменение состоит в том, чтобы иметь два файла, file1
и file2
, и повторно открывать файл2 для каждого прохода через цикл.
def is_reverse(word1, word2):
if len(word1) == len(word2):
if word1 == word2[::-1]:
return True
return False
file1 = open('List.txt')
for word1 in file1:
word1 = word1.strip()
word1 = word1.lower()
file2 = open('List.txt')
for word2 in file2:
word2 = word2.strip()
word2 = word2.lower()
print word1 + word2
if is_reverse(word1, word2):
print word1 + ' is the opposite of ' + word2
Но, вероятно, лучший способ - это прочитать файлы один раз в списока затем выполните итерацию по списку, а не по файлу, например
def is_reverse(word1, word2):
if len(word1) == len(word2):
if word1 == word2[::-1]:
return True
return False
file = open('List.txt')
words = list(file)
for word1 in words:
word1 = word1.strip()
word1 = word1.lower()
for word2 in words:
word2 = word2.strip()
word2 = word2.lower()
print word1 + word2
if is_reverse(word1, word2):
print word1 + ' is the opposite of ' + word2
Чтобы ответить на другой вопрос, почему вы можете выполнять итерацию по одному и тому же списку дважды, но не по одному и тому же файлу:
Цикл for element in iterable
запрашивает iterable
для своего итератора , вызывая iterable.__iter__
.
Когда Python запрашивает файл для своего итератора, файл возвращается сам.Это означает, что каждый итератор над файлом имеет одно и то же состояние / позицию.
>>> file = open('testfile.txt')
>>> it1 = iter(file)
>>> it2 = iter(file)
>>> id(it1)
3078689064L
>>> id(it2)
3078689064L
>>> id(file)
3078689064L
Когда вы запрашиваете список для его итератора, вы каждый раз получаете разные итераторы с отдельной информацией о своей позиции.
>>> list = [1,2,3]
>>> it3 = iter(list)
>>> it4 = iter(list)
>>> id(it3)
3078746156L
>>> id(it4)
3078746188L
>>> id(list)
3078731244L
Постскриптум
Как отмечает Хью, перебор списка слов для каждого слова будет очень неэффективным.
Вот способ, которым этонамного быстрее.Измените List.txt
на очень большой файл, например /usr/share/dict/words
в системе Linux, чтобы понять, что я имею в виду.
words = []
wordset = set(())
file = open('List.txt')
for line in file:
word = line.strip('\n')
words.append(word)
wordset.add(word)
for word in words:
reversed = word[::-1]
if reversed in wordset:
print word + ' is the opposite of ' + reversed