首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在文本文件中找到最长的单词?

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

Stack Overflow用户
提问于 2013-04-23 09:08:02
回答 3查看 7.5K关注 0票数 0

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

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

每个字母只能使用一次。因此,从“qugteroda”中,我应该被抹黑,愤怒,大胆,朗读,愤怒,读出。我使用的是python 3.3

我的代码如下所示:

代码语言:javascript
运行
复制
def Words():
    qfile=open('dict.txt','r')
    long=''
    for line in qfile:
    if len(line)>len(long):
        long=line
    return long
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-23 09:27:29

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

为此,您可以使用长度等于字符串长度的itertools.combinations()。您将根据排序后的字典检查所有这些组合,如果没有找到匹配的组合,则缩短组合长度。

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

如下所示:

代码语言:javascript
运行
复制
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的答案。

票数 5
EN

Stack Overflow用户

发布于 2013-04-23 09:19:40

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

如果您希望最长的行是某个输入字符串的变形词,则需要获取输入字符串,并过滤掉不是变形词的行。

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

代码语言:javascript
运行
复制
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即可。

或者,如果你所说的“你不能重复字母”实际上是指“你必须在两个字符串中重复完全相同的字母,它们才能算作字谜”,那也很简单:不是比较字母集,而是比较排序的字母列表:

代码语言:javascript
运行
复制
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不是一个很好的名字--虽然从Python3.0开始它不再是一种类型,但它可能会让从2.x开始使用Python2.x的读者感到困惑(在这一点上,Python2.x仍然是主要的)。

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

因此,让我们编写另一个版本来改变这一切,并检查子集而不是完整集:

代码语言:javascript
运行
复制
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)进行比较。

票数 4
EN

Stack Overflow用户

发布于 2018-08-17 16:36:43

代码语言:javascript
运行
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16159239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档