我想将输入字母(字典)与列表(带有单词的文本文件)进行比较,并打印与输入字母匹配的单词。我做错了什么?(我知道如果它现在找到一个匹配的单词,我只有一个打印YES或NO函数。顺便创建这个函数的最佳方法是什么?)。
def ordlista(list):
fil = open("ord.txt", "r")
words = fil.readlines()
list = []
for w in words:
w = w.strip()
list.append(w)
return list
chars = {}
word = raw_input("Write 9 letters: ")
for w in word:
w = w.lower()
if w not in chars:
chars[w] = 1
else:
chars[w] += 1
if chars.keys() in ordlista(list):
print "YES"
else:
print "NO"
答案 0 :(得分:2)
您正在检查字符列表中是否存在整个键列表,而不是单独检查每个键。您必须单独迭代您的密钥,然后检查它们的存在。
for k in chars:
if k in ordlista(list):
print "YES"
else:
print "NO"
如果您想打印仅由字符列表中的字母组成的单词,您可以使用以下方法。
for word in ordlista(list):
if not filter(lambda char: char not in chars, word):
print word
答案 1 :(得分:2)
chars.keys()
是一个列表,所以
chars.keys() in ordlista(list):
永远不会是真的。你想要的是匹配列表中每个单词的字母数。所以我建议
charsum = sum(chars.values())
for word in wordlist:
if len(word) == charsum and all([(word.count(c) == chars[c]) for c in chars]):
print "YES for word '%s'" % word
编辑:如果你想要匹配那些至少字母计数的单词(即一个带有3个字的单词将匹配两个a的输入),那么你将不得不改变==
到>=
。
EDIT2:由于您需要完全匹配,最简单的解决方案是计算字符数并确保单词具有该长度。
答案 2 :(得分:1)
使用sets:
chars = set(raw_input("Write 9 letters: "))
for word in ordlista(None):
if(set(word) == chars):
print "YES for '%s'" % word
顺便说一下,list
到ordlista
的参数是不必要的,因为它没有被使用。我还建议不要使用名称list
,因为它隐藏了内置的<type 'list'>
更新:我已阅读你关于jellybean帖子的评论。如果每个字母只能使用一次,你显然不能使用套装!