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)