如何在文本文件中找到最长的单词?

时间:2013-04-23 01:08:02

标签: python python-3.x python-3.3

我创建了一个函数来查找文本文件中最长的单词,并在文本文件中找到可以由9个字母组成的最长单词。我是python的新手,我正在创建一个类似倒计时的游戏。

我创建了一个函数来查找文本文件中最长的单词。我现在想要的是创建python代码以找到可以由9个字母组成的最长单词。

每封信只能使用一次。因此,从'qugteroda',我应该得到rag outou,愤怒,out out,out read,outout,readout。我正在使用python 3.3

我的代码如下:

def Words():
    qfile=open('dict.txt','r')
    long=''
    for line in qfile:
    if len(line)>len(long):
        long=line
    return long

3 个答案:

答案 0 :(得分:5)

因此,您希望从字典中存在的一组字母中找到排序最长的组合。

为此,您使用长度等于字符串长度的itertools.combinations()。您将根据排序的字典检查所有这些组合,如果找不到匹配项,请减少组合长度。

您还希望将整个字典加载到一个集合中以减少搜索时间。我已将这组单词加载到字典中,其中键是排序字符串,值是具有相同排序表示的单词列表。

这样的事情:

import itertools
from collections import defaultdict

words = defaultdict(list)
with open('/usr/share/dict/words') as qfile:
    for word in qfile:
        word = word.rstrip('\n').lower()
        words[''.join(sorted(word))].append(word)

def longest_anagram(term, words):
    search_length = len(term)
    term = sorted(term) # combinations maintains sort order
    while search_length > 0:
        for combo in itertools.combinations(term, search_length):
            search = ''.join(combo) # sort above means we dont need it here
            if search in words:
                return words[search]
        search_length -= 1
    return None

found = longest_anagram('qugteroda', words)
for w in found:
    print(w)

为了完整起见,我应该提到这种方法适用于18个字母或更少的搜索字符串。如果你需要从一串大于18的字母中找到最长的字谜,你最好不要翻转算法,这样你就可以将字典单词按长度排序到一个列表中。然后,您将遍历所有单词并检查它们是否存在于输入搜索字符串中 - 非常类似于@ abarnert的答案。

答案 1 :(得分:4)

您当前的代码返回文本文件中的最长行,句号。

如果你想要一个输入字符串的字符串的最长行,你需要输入一个输入字符串,并过滤掉不是字母的行。

由于您指定没有重复字母,检查两个单词是否为字谜的最简单方法是检查它们是否各自具有相同的字母组。所以:

def Words(inputletters):
    inputletters = set(inputletters)
    qfile=open('dict.txt','r')
    long=''
    for line in qfile:
        if set(line.strip()) == inputletters:
            if len(line)>len(long):
                long=line
    return long

如果您不是在寻找完全匹配,而只是寻找子集,只需将==替换为.issubset

或者如果通过“你不能重复字母”,你实际上意味着“你必须完全重复两个字符串中的相同的字母才能算作字谜”,这也很简单:而不是比较< em>设置字母,比较排序列表的字母:

def Words(inputletters):
    inputletters = sorted(inputletters)
    qfile=open('dict.txt','r')
    long=''
    for line in qfile:
        if sorted(line.strip()) == inputletters:
            if len(line)>len(long):
                long=line
    return long

等等。一旦您可以准确定义您要搜索的内容,就可能对数据结构和/或比较进行微不足道的更改。

我不认为这是一个完整的程序,无论你想要什么,但它应该足以让(a)让你指向正确的方向,或(b)让你澄清问题好一点。


与此同时,还有一些其他方面可以改进:

首先,您应该始终关闭您打开的文件(理想情况下使用with语句)。

虽然我们正在使用它,但通常的Python编码标准(在PEP 8中编码)表明小写的函数名称。并且long对于变量来说不是一个好名字 - 虽然它不再是Python 3.0的类型,但它可能会混淆从2.x开始使用Python的读者(此时,它仍然是大多数人。)

更有趣的是,像Python中的许多简单for循环一样,整个循环可以通过使用迭代器转换调用链来替换。结果通常更简洁,更快速,更难以出错,并且通常更具可读性。

所以,让我们编写另一个版本来改变所有这一切,并检查一个子集而不是一整套:

def words(inputletters):
    inputletters = set(inputletters)
    with open('dict.txt') as qfile:
        words = map(str.strip, qfile)
        letters = map(set, words)
        matching = filter(inputletters.issubset, letters)
        longest = max(matching, key=len)
        return longest

当然你可以将其中的一些调用合并在一起(或者甚至将整个链转换成一个单行,但我认为这可能会推动可读性的界限),或者将它们重写为生成器表达式(它们组合得更多)很好地比较(set(line.strip()) for line in qfile)map(set, map(str.strip, file))map(lambda line: set(line.strip()), qfile)

答案 2 :(得分:0)

def longestWord(fileName):
    mx = 0
    op = open(fileName,'r')
    words = op.read().split()
    for i in words:
        if len(i) > mx:
            mx = len(i)
            word = i
            #return the longest word and its length
    return (mx,word)