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

Python 如何在文本文件中找到最长的单词?,python,python-3.x,python-3.3,Python,Python 3.x,Python 3.3,我创建了一个函数来查找文本文件中最长的单词,并在一个可以由9个字母组成的文本文件中查找最长的单词。我是python新手,我正在创建一个类似倒计时的游戏 我创建了一个函数来查找文本文件中最长的单词。我现在想要的是创建python代码,以查找可以由9个字母组成的最长单词 每个字母只能使用一次。所以从《古特罗达》开始,我应该被揭穿,愤怒,大胆,大声朗读,愤怒,大声朗读。我正在使用python 3.3 我的代码如下所示: def Words(): qfile=open('dict.txt','r

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

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

每个字母只能使用一次。所以从《古特罗达》开始,我应该被揭穿,愤怒,大胆,大声朗读,愤怒,大声朗读。我正在使用python 3.3

我的代码如下所示:

def Words():
    qfile=open('dict.txt','r')
    long=''
    for line in qfile:
    if len(line)>len(long):
        long=line
    return long
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)

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

如果你想要最长的一行是某个输入字符串的一个字谜,你需要一个输入字符串,过滤掉那些不是字谜的行

由于您指定不存在重复字母,因此检查两个单词是否为字谜的最简单方法就是检查它们是否具有相同的字母集。因此:

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即可

或者,如果您不能重复字母,实际上意味着您必须在两个字符串中重复完全相同的字母,才能将它们算作字谜,这也很简单:与其比较字母集,不如比较已排序的字母列表:

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
等等。一旦您能够准确地定义您要搜索的内容,那么对数据结构和/或比较可能只是一个微不足道的更改

我不认为这是一个完整的计划,无论你打算做什么,但它应该足以让你指出正确的方向,或者让你更好地澄清问题

同时,您还可以改进一些其他方面:

首先,最好使用with语句关闭打开的文件

当我们使用它时,通常的Python编码标准(如中所编码)建议使用小写函数名。long并不是一个很好的变量名称,虽然它不再像python3.0那样是一种类型,但它可能会让自2.x以来一直在使用Python的读者感到困惑,目前,Python仍然是主流

更有趣的是,与Python中的许多simple 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

当然,您可以将其中一些调用合并在一起,甚至可以将整个链转换为一行,但我认为这可能会提高可读性的界限,或者将它们重写为生成器表达式,将qfile中的setline.strip与mapset、mapstr.strip、file或maplambda line:setline.strip中的行进行比较,可以更好地组合,qfile.

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

要执行此操作,请使用与字符串长度相等的长度。您将对照已排序的字典检查所有这些组合,如果未找到匹配项,则减少组合长度

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

大概是这样的:

def Words():
    qfile=open('dict.txt','r')
    long=''
    for line in qfile:
    if len(line)>len(long):
        long=line
    return long
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的答案。

为了澄清这一点,您在问如何从字母列表中找出最长的单词?你能重复字母吗?如何使单词尽可能长。你不能重复字母。你熟悉游戏倒计时吗?你不应该用long作为变量名。这也是内置函数的名称。@omz不正确。OP明确说明他们使用的是python3。@wim哦,你说得对,谢谢。虽然OP确实说你不能重复字母,但我认为OP真正的意思是你必须尊重多重性,即如果你只有一个e,你就不能用两个e拼写一个单词。这就是大多数游戏的工作原理,包括倒计时,OP的倒计时:每个字母只能在选择中出现的时候使用。@wim:除非我误解了你的评论,否则这就是代码的作用,也是OP要求的,所以…到底出了什么问题?@DSM:我试图回答OP实际提出的问题,而不是猜测他真正想要什么。但这是公关
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)

etty显然是猜测,还有其他各种可能性。我对答案进行了编辑,以显示OP可以很容易地改变答案,以适应他实际试图解决的任何问题。谢谢你的评论。@abarnert OP没有关闭他们的文件,但这并不意味着你不必关闭!我的观点是,如果setline.strip==inputletters:将在密西西比州这样的线路上发射,而inputletters只是设置为“pims”,根据我对问题的解释,这将是一个bug。我还认为,复制和粘贴OPs代码,而不清理明显的东西,如python风格的约定、悬空的文件句柄等,是很草率的……我认为您的意思是减少搜索时间@abarnert我确实做到了:不管怎样,通过这种方式,您必须迭代所有362880+181440+…排列,以便在哈希表中查找它们。考虑到字典通常是36K个单词的数量级,迭代字典应该快一个数量级。当然,随着字谜变长,情况变得更糟。有了这个答案还是绝对值得的,因为OP应该仔细思考这些问题。@abarnert如果我是为自己写的,我会创建一个字典,为排序后的字符串键入关键字,并将其索引到匹配项的列表中。当然,假设我会一次查到一个以上的单词。请考虑添加更多关于你的答案的信息和代码,尽管你的帖子可能会回答这个问题,但是它缺少一些解释文本和文档。请编辑您的答案并提供一些答案。