关于Python:Python – 检查列表中的所有字母和仅字母中的字母是否与字符串中的字母匹配?

Python - Checking if all and only the letters in a list match those in a string?

我正在用python 2.7创建一个anagram解算器。

解算器获取用户输入的anagram,将每个字母转换为列表项,然后对照".txt"文件的行检查列表项,将匹配anagram字母的任何单词追加到possible_words列表中,准备打印。

它起作用了…几乎!

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"计算为两个单独的条目?

我做错什么了?我觉得有一个简单的解决方案我错过了?

谢谢!


这可能是使用collections.Counter最容易解决的问题。

1
2
3
4
5
>>> from collections import Counter
>>> Counter('Hello') == Counter('loleH')
True
>>> Counter('Hello') == Counter('loleHl')
False

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


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

一种方法是计算每个单词的字母。如果字母数相等,则为变位词。这可以通过集合轻松实现。计数器类:

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)