Python - Checking if all and only the letters in a list match those in a string?
我正在用python 2.7创建一个anagram解算器。
解算器获取用户输入的anagram,将每个字母转换为列表项,然后对照".txt"文件的行检查列表项,将匹配anagram字母的任何单词追加到
它起作用了…几乎!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 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 + ' ' for x in anagram) and len(line) == len(anagram) + 1: line = line.strip() possible_words.append(line) print" ".join(possible_words) |
对于没有重复字母的变位词,它工作得很好,但对于"hello"等单词,输出包含"helio、whole、holes"等单词,因为解算器似乎不将字母"l"计算为两个单独的条目?
我做错什么了?我觉得有一个简单的解决方案我错过了?
谢谢!
这可能是使用
1 2 3 4 5 | >>> from collections import Counter >>> Counter('Hello') == Counter('loleH') True >>> Counter('Hello') == Counter('loleHl') False |
您的代码按预期执行。实际上,你还没有让它检查一个字母是否出现两次(或3次以上),它只是检查了两次
一种方法是计算每个单词的字母。如果字母数相等,则为变位词。这可以通过集合轻松实现。计数器类:
1 2 3 4 5 6 7 8 9 10 11 | 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" ".join(possible_words) |
另一种方法是使用sorted()函数,正如Chris在另一个答案的注释中建议的那样。这会按照字母顺序对变位词和行中的字母进行排序,然后检查它们是否匹配。此过程比Collections方法运行得更快。
1 2 3 4 5 6 7 8 9 10 | 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" ".join(possible_words) |