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

Python-检查列表中的所有字母和字符串中的字母是否匹配?,python,list,python-2.7,pattern-matching,anagram,Python,List,Python 2.7,Pattern Matching,Anagram,我正在Python2.7中创建一个字谜解算器 解算器获取用户输入的字谜,将每个字母转换为列表项,然后对照“.txt”文件的行检查列表项,将与字谜字母匹配的任何单词附加到可能的单词列表中,以备打印 它是有效的。。。差不多了 对于没有重复字母的字谜,它可以正常工作,但对于诸如“hello”之类的单词,输出包含诸如“helio、whole、holes”之类的单词,因为解算器似乎没有将字母“L”计算为两个单独的条目 我做错了什么?我觉得有一个简单的解决方案我错过了 谢谢 这可能是使用集合计数器最容易

我正在Python2.7中创建一个字谜解算器

解算器获取用户输入的字谜,将每个字母转换为列表项,然后对照“.txt”文件的行检查列表项,将与字谜字母匹配的任何单词附加到
可能的单词列表中,以备打印

它是有效的。。。差不多了



对于没有重复字母的字谜,它可以正常工作,但对于诸如“hello”之类的单词,输出包含诸如“helio、whole、holes”之类的单词,因为解算器似乎没有将字母“L”计算为两个单独的条目

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


谢谢

这可能是使用
集合计数器最容易解决的问题

>>> from collections import Counter
>>> Counter('Hello') == Counter('loleH')
True
>>> Counter('Hello') == Counter('loleHl')
False

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

这可能是使用
集合最容易解决的问题。计数器

>>> from collections import Counter
>>> Counter('Hello') == Counter('loleH')
True
>>> Counter('Hello') == Counter('loleHl')
False

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

您的代码会按预期执行。实际上,您并没有让它检查一个字母是否出现两次(或3次以上),它只是检查单词中的“l”是否出现两次,这对于至少有一个“l”的所有单词总是正确的

一种方法是数一数每个单词的字母。如果字母数相等,则它是一个字谜。这可以通过以下课程轻松实现:

另一种方法是使用函数,正如Chris在另一个答案的评论中所建议的那样。这将把字谜和行中的字母按字母顺序排序,然后检查它们是否匹配。此过程比collections方法运行得更快

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)

您的代码按预期运行。实际上,您并没有让它检查一个字母是否出现两次(或3次以上),它只是检查单词中的“l”是否出现两次,这对于至少有一个“l”的所有单词总是正确的

一种方法是数一数每个单词的字母。如果字母数相等,则它是一个字谜。这可以通过以下课程轻松实现:

另一种方法是使用函数,正如Chris在另一个答案的评论中所建议的那样。这将把字谜和行中的字母按字母顺序排序,然后检查它们是否匹配。此过程比collections方法运行得更快

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)

你的算法太简单了。您可以检查两个字符串中每种类型的字符的计数是否相同,而不是检查
字谜
中的每个字符是否都在
(这不足以识别字谜)。问题在于
all(行中的x+'\n'表示字谜中的x)
。如果单词中有一个“l”,而字谜中有100个,它仍然会返回
True
可能需要查看一些想法。。。(这实际上是同一个问题)@Ev.Kounis,谢谢你的提醒。我对Python还是相当陌生,并且认为我误解了all()函数的应用。我主要是蛮力地强迫这条线,直到我让它工作,我想我还没有完全理解它是如何工作的。如果它不太超出这个问题的范围,你能准确地解释它的作用吗?提取字谜中存在的每个字母(
表示字谜中的x
),并检查它是否存在于该行(
x in line
all(x,y,z,…)
与表示
x、y和z以及…
相同,因此,该行中的所有字母也必须存在于该行中,但该行不能包含更多em(
len(line)==len(anagram)
)。请以不同的方式处理换行符。它没有任何位置,因为你的算法太简单了。您可以检查两个字符串中每种类型的字符的计数是否相同,而不是检查
字谜
中的每个字符是否都在
(这不足以识别字谜)。问题在于
all(行中的x+'\n'表示字谜中的x)
。如果单词中有一个“l”,而字谜中有100个,它仍然会返回
True
可能需要查看一些想法。。。(这实际上是同一个问题)@Ev.Kounis,谢谢你的提醒。我对Python还是相当陌生,并且认为我误解了all()函数的应用。我主要是蛮力地强迫这条线,直到我让它工作,我想我还没有完全理解它是如何工作的。如果它不太超出这个问题的范围,你能准确地解释它的作用吗?提取字谜中存在的每个字母(
表示字谜中的x
),并检查它是否存在于该行(
x in line
all(x,y,z,…)
与表示
x、y和z以及…
相同,因此,该行中的所有字母也必须存在于该行中,但该行不能包含更多em(
len(line)==len(anagram)
)。请以不同的方式处理换行符。它在那里没有任何位置xd,或者只是
sorted('Hello')==sorted('loleHl')
作为回答:感谢@mgilson的回复,我以前没有听说过计数器类,但它看起来像是一个有用的方法!我选择了另一个正确的答案,因为它更详细一些,我觉得这很有帮助,但是看到计数器模块的不同控制台输出是很有用的。还感谢@Chris_Rands的回复,似乎排序方法的运行速度比使用集合快得多,所以我编辑了另一个答案来包含它。或者干脆
sorted('Hello')==sorted('loleHl')
作为这个答案:感谢@mgilson的回复,我以前没有听说过计数器类,但它看起来像是一个有用的方法!我选择了另一个答案,因为它更加详细