Python - 检查列表中是否所有字母和字母中的字母都匹配?

时间:2016-08-31 14:12:26

标签: python list python-2.7 pattern-matching anagram

我在 Python 2.7 中创建 Anagram Solver

解算器获取用户输入的字谜,将每个字母转换为列表项,然后根据' .txt'的行来检查列表项。文件,将任何与anagram的字母匹配的单词附加到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)

对于没有重复字母的字谜,它可以正常工作,但对于诸如“你好”之类的字样,输出中包含诸如' helio,whole,holes'等字样,如解算器似乎没有计算字母' L'作为2个单独的条目?

我做错了什么?我觉得我找不到一个简单的解决方案吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

使用collections.Counter

可能最容易解决
>>> from collections import Counter
>>> Counter('Hello') == Counter('loleH')
True
>>> Counter('Hello') == Counter('loleHl')
False

Counter会检查每个字母的字母和次数是否相同。

答案 1 :(得分:1)

您的代码按照预期执行。你实际上没有检查一个字母是否出现两次(或3次以上),只检查if 'l' in word两次,对于至少有一个l的所有单词,它总是为真。

一种方法是计算每个单词的字母。如果字母数相等,那么它就是一个字谜。使用collections.Counter类:

可以轻松实现这一点
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()函数,正如Chris在其他答案的评论中所建议的那样。这会将字谜和线条中的字母按字母顺序排序,然后检查它们是否匹配。此过程比集合方法运行得更快。

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)