检查可以使用给定字母组形成的单词文件:奇怪的结果?

时间:2016-12-15 18:58:04

标签: python string list file

我对python很新,并且得到了一些奇怪的结果,肯定是由于我的基本错误...

基本上,在Python 3.x中,我必须定义一个函数(best_words(ltr_set,word_file)),它接受一组字母(字符列表)并搜索单词的.txt文件(每行1个字)那些可以用这些字母组成的那些。

我首先定义了一个函数,用于检查给定单词是否可以从给定的字母集合中生成。要检查的单词必须作为字符列表(lsta)输入此函数,因此可以根据可用的字母集(lstb)进行检查:

def can_make_lsta_wrd_frm_lstb(lsta,lstb):
    result = True
    i = 0
    while i < len(lsta) and result == True:
        if lsta[i] in lstb:
            lstb.remove(lsta[i])
            i+=1
        else:
            result = False
    return result

我还定义了一个函数,它接受任何给定的字符串并将其转换为它的字符列表:

def lst(string):
    ls = []
    for c in string:
        ls.append(c)
    return ls

best_words函数背后的想法是采用一组给定的字母并将上述函数应用于单词文件中的每一行,目的是过滤到只能制作的字符串。从可用的信件......

def best_words(ltr_set, word_file):

    possible_words = []

    f = open(word_file)
    lines = f.readlines()

    i = 0
    while i < len(lines):
        lines[i] = lines[i].strip('\n')
        i+=1

    for item in lines:
        if can_make_lsta_wrd_frm_lstb(lst(item),ltr_set):
            possible_words.append(item)

    return possible_words 

然而,我一直得到一个意想不到的结果,好像循环没有继续,因为它应该......

例如,如果我使用以下单词取一个文件short_dictionnary.txt:

AA
AAS
ABACA
ABACAS
ABACOST
ABACOSTS
ABACULE
ABACULES
ABAISSA
ABAISSABLE

并调用函数:

best_words([‘A’,’C’,’B’,’A’,’S’,’A’], “short_dictionnary.txt”)

possible_words列表仅由“AA”组成......而AAS,ABACA和ABACAS也可以组建......

如果有人能看到正在发生的事情,我们非常感谢他们的意见!

2 个答案:

答案 0 :(得分:0)

我会将letter_set转换为Counter,然后对于每个字母中的可能字词,检查letter_set中是否有足够的字母来制作该字词。您还在泄漏文件引用。

from collections import Counter

def can_make_word(c, word):
    return all(c[letter]>=count for letter, count in Counter(word).most_common())

def best_words(ltr_set, word_file):

    possible_words = []
    c = Counter(ltr_set)

    with open(word_file) as f:
        lines = f.readlines()

    lines = [line.strip() for line in lines]

    for item in lines:
        if can_make_word(c, item):
            possible_words.append(item)

    return possible_words 

答案 1 :(得分:0)

谢谢大家,我现在明白我必须做的事情!

我基本上需要确保原始的ltr_set没有被修改;所以这是通过制作一个简单的副本来实现的。我不知道回答我自己的问题是否有用(我对这个论坛很新),但如果有人认为它对解决有用,那么这里有更正的can_make...函数类似的问题:

def can_make_lsta_wrd_frm_lstb(lsta,lstb):
    lstb_copy = lstb[:]
    result = True
    i = 0
    while i < len(lsta) and result == True:
        if lsta[i] in lstb_copy:
            lstb_copy.remove(lsta[i])
            i+=1
        else:
            result = False
    return result