Python - 检查列表中的所有字母是否与字符串中的字母匹配?
Python - Checking if all and only the letters in a list match those in a string?
我正在 Python 2.7.
中创建 Anagram Solver
求解器采用用户输入的字谜,将每个字母转换为列表项,然后根据“.txt”文件的行检查列表项,将与字谜字母匹配的所有单词附加到 possible_words
列表,准备打印。
有效...几乎!
# Anagram_Solver.py
anagram = list(raw_input("Enter an Anagram: ").lower())
possible_words = []
with file('wordsEn.txt', 'r') as f:
for line in f:
if all(x in line + '\n' for x in anagram) and len(line) == len(anagram) + 1:
line = line.strip()
possible_words.append(line)
print "\n".join(possible_words)
对于没有重复字母的字谜,它工作正常,但对于 'hello' 等单词,输出包含 'helio, whole, holes' 等单词,因为求解器似乎没有计算字母 'L' 是 2 个单独的条目?
我做错了什么?我觉得我缺少一个简单的解决方案?
谢谢!
这可能是使用 collections.Counter
最容易解决的问题
>>> from collections import Counter
>>> Counter('Hello') == Counter('loleH')
True
>>> Counter('Hello') == Counter('loleHl')
False
Counter
将检查字母和每个字母出现的次数是否相同。
您的代码符合预期。您实际上并没有让它检查一个字母是否出现两次(或 3 次以上),它只是检查 if 'l' in word
两次,对于至少有一个 l
.[= 的所有单词,这将始终为 True 16=]
一种方法是计算每个单词的字母数。如果字母数相等,则它是一个字谜。这可以通过 collections.Counter class:
轻松实现
from collections import Counter
anagram = raw_input("Enter an Anagram: ").lower()
with file('wordsEn.txt', 'r') as f:
for line in f:
line = line.strip()
if Counter(anagram) == Counter(line):
possible_words.append(line)
print "\n".join(possible_words)
另一种方法是使用 sorted() 函数,正如克里斯在其他答案的评论中所建议的那样。这会将 anagram 和 line 中的字母按字母顺序排序,然后检查它们是否匹配。此过程比收集方法运行得更快。
anagram = raw_input("Enter an Anagram: ").lower()
with file('wordsEn.txt', 'r') as f:
for line in f:
line = line.strip()
if sorted(anagram) == sorted(line):
possible_words.append(line)
print "\n".join(possible_words)
我正在 Python 2.7.
中创建 Anagram Solver求解器采用用户输入的字谜,将每个字母转换为列表项,然后根据“.txt”文件的行检查列表项,将与字谜字母匹配的所有单词附加到 possible_words
列表,准备打印。
有效...几乎!
# Anagram_Solver.py
anagram = list(raw_input("Enter an Anagram: ").lower())
possible_words = []
with file('wordsEn.txt', 'r') as f:
for line in f:
if all(x in line + '\n' for x in anagram) and len(line) == len(anagram) + 1:
line = line.strip()
possible_words.append(line)
print "\n".join(possible_words)
对于没有重复字母的字谜,它工作正常,但对于 'hello' 等单词,输出包含 'helio, whole, holes' 等单词,因为求解器似乎没有计算字母 'L' 是 2 个单独的条目?
我做错了什么?我觉得我缺少一个简单的解决方案?
谢谢!
这可能是使用 collections.Counter
>>> from collections import Counter
>>> Counter('Hello') == Counter('loleH')
True
>>> Counter('Hello') == Counter('loleHl')
False
Counter
将检查字母和每个字母出现的次数是否相同。
您的代码符合预期。您实际上并没有让它检查一个字母是否出现两次(或 3 次以上),它只是检查 if 'l' in word
两次,对于至少有一个 l
.[= 的所有单词,这将始终为 True 16=]
一种方法是计算每个单词的字母数。如果字母数相等,则它是一个字谜。这可以通过 collections.Counter class:
轻松实现from collections import Counter
anagram = raw_input("Enter an Anagram: ").lower()
with file('wordsEn.txt', 'r') as f:
for line in f:
line = line.strip()
if Counter(anagram) == Counter(line):
possible_words.append(line)
print "\n".join(possible_words)
另一种方法是使用 sorted() 函数,正如克里斯在其他答案的评论中所建议的那样。这会将 anagram 和 line 中的字母按字母顺序排序,然后检查它们是否匹配。此过程比收集方法运行得更快。
anagram = raw_input("Enter an Anagram: ").lower()
with file('wordsEn.txt', 'r') as f:
for line in f:
line = line.strip()
if sorted(anagram) == sorted(line):
possible_words.append(line)
print "\n".join(possible_words)