2011-09-19 79 views
2

我想将输入字母(字典)与列表(带文字的文本文件)进行比较,并打印与输入字母匹配的单词。我做错了什么?(我知道如果当前找到匹配的单词,我只有打印YES或NO-函数。顺便说一句,创建这个函数的最好方法是什么?)。Python wordlist

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" 

回答

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字的匹配的两个的输入),那么你会必须将==更改为>=。编辑2:既然你想要完全匹配,最简单的解决方案是计算字符的数量,并确保单词有这个长度。

+0

是的,就差不多了!但正如你所看到的,它也显示包含其他角色的单词。我只是想要它打印,如果让我们说有一个词“lov”。 写字母:ovl YES是单词'ovlig' YES是单词'ovningsledare' – Mix

+0

好的,相应更新。现在给我我血腥的upvote。 :o) –

+0

我是一名新用户,所以我没有声望让你知道你刚才的表现!)...我会在明天回复你! – Mix

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 
+0

谢谢,这使得它迭代。但是我希望它能够找到整个单词(在列表中),这些单词由输入字典的字母组成(字词不能包含任何其他字母,除了字典中的某些字母之外)。 也许我必须重写一些代码?但我该怎么做呢?我对此很新颖。 – Mix

+0

我修改了我的答案。 – cheeken

1

使用sets

chars = set(raw_input("Write 9 letters: ")) 

for word in ordlista(None): 
    if(set(word) == chars): 
     print "YES for '%s'" % word 

顺便说一句,该参数listordlista是不必要的,因为它不被使用。我也建议不要在一般使用名称list,因为它隐藏了内置<type 'list'>

更新:我已经阅读豆形软糖的讯息的留言。如果每封信只能使用一次,显然不能使用套装!