字谜查找器 Python
Anagram Finder Python
我想要 return 'listofwords.txt' 中的单词列表,这些单词是某些字符串 'b'
的变位词
def find_anagrams(a,b): ##a is the listofwords.txt
f=open('listofwords.txt', 'r')
for line in f:
word=line.strip()
wordsorted= ''.join(sorted(line))
for word in f:
if wordsorted == ''.join(sorted(word)):
print word
为什么它只给我列表中第一个单词的字谜?
另外,如果找不到字谜,我如何 return 发消息?
第二个for
不正确。并且您将 wordsorted 与 ''.join(sorted(word)) 进行比较,它们是同一回事。这应该会更好:
def find_anagrams(a, b):
f = open(a, 'r')
for line in f:
word = line.strip()
wordsorted = ''.join(sorted(word))
if wordsorted == ''.join(sorted(b)):
print word
现在,请确保关闭该文件(或者,最好使用 with
语句)。
编辑: 关于 return 发送消息,最好的做法实际上是 return 列出找到的字谜。然后你决定如何处理这些单词(打印它们,或者在列表为空时打印一条消息,或者任何你想要的)。所以它可能像
def find_anagrams(a, b):
anagrams = []
with open(a, 'r') as infile:
for line in f:
word = line.strip()
wordsorted = ''.join(sorted(word))
if wordsorted == ''.join(sorted(b)):
anagrams.append(word)
return anagrams
那你就可以把它当作
anagrams = find_anagrams('words.txt', 'axolotl')
if len(anagrams) > 0:
for anagram in anagrams:
print anagram
else:
print "no anagrams found"
您正在内部循环中重复使用文件迭代器 f
。内循环完成后,f
将耗尽,您会立即退出外循环,因此您实际上并没有超过第一行。
如果你想对文件中的所有行进行两个独立的循环,一个解决方案(我相信这个问题可以更有效地解决)是首先将行读入列表然后迭代名单:
with open('listofwords.txt') as f: # note: 'r' is the default mode
lines = f.readlines() # also: using `with` is good practice
for line in lines:
word = line.strip()
wordsorted = ''.join(sorted(line))
for word in lines:
if word == ''.join(sorted(word)):
print word
编辑:我的代码没有解决你所说的问题(我首先误解了它,请参阅 matiasg 的正确代码答案),但我的答案仍然解释了为什么你只得到文件中第一个单词的字谜.
我想要 return 'listofwords.txt' 中的单词列表,这些单词是某些字符串 'b'
的变位词def find_anagrams(a,b): ##a is the listofwords.txt
f=open('listofwords.txt', 'r')
for line in f:
word=line.strip()
wordsorted= ''.join(sorted(line))
for word in f:
if wordsorted == ''.join(sorted(word)):
print word
为什么它只给我列表中第一个单词的字谜?
另外,如果找不到字谜,我如何 return 发消息?
第二个for
不正确。并且您将 wordsorted 与 ''.join(sorted(word)) 进行比较,它们是同一回事。这应该会更好:
def find_anagrams(a, b):
f = open(a, 'r')
for line in f:
word = line.strip()
wordsorted = ''.join(sorted(word))
if wordsorted == ''.join(sorted(b)):
print word
现在,请确保关闭该文件(或者,最好使用 with
语句)。
编辑: 关于 return 发送消息,最好的做法实际上是 return 列出找到的字谜。然后你决定如何处理这些单词(打印它们,或者在列表为空时打印一条消息,或者任何你想要的)。所以它可能像
def find_anagrams(a, b):
anagrams = []
with open(a, 'r') as infile:
for line in f:
word = line.strip()
wordsorted = ''.join(sorted(word))
if wordsorted == ''.join(sorted(b)):
anagrams.append(word)
return anagrams
那你就可以把它当作
anagrams = find_anagrams('words.txt', 'axolotl')
if len(anagrams) > 0:
for anagram in anagrams:
print anagram
else:
print "no anagrams found"
您正在内部循环中重复使用文件迭代器 f
。内循环完成后,f
将耗尽,您会立即退出外循环,因此您实际上并没有超过第一行。
如果你想对文件中的所有行进行两个独立的循环,一个解决方案(我相信这个问题可以更有效地解决)是首先将行读入列表然后迭代名单:
with open('listofwords.txt') as f: # note: 'r' is the default mode
lines = f.readlines() # also: using `with` is good practice
for line in lines:
word = line.strip()
wordsorted = ''.join(sorted(line))
for word in lines:
if word == ''.join(sorted(word)):
print word
编辑:我的代码没有解决你所说的问题(我首先误解了它,请参阅 matiasg 的正确代码答案),但我的答案仍然解释了为什么你只得到文件中第一个单词的字谜.