Python 从任意字母中查找最大长度单词

Python 从任意字母中查找最大长度单词,python,puzzle,iterator,Python,Puzzle,Iterator,我有10个任意字母,需要检查Word文件中的最大长度匹配 我不久前才开始学习RE,似乎找不到合适的模式 第一个想法是使用set:[10个字符],但它也会重复包含的字符,我不知道如何避免这种情况 我最近开始学习Python,但在RE之前,可能不需要RE,这可以不用它解决 使用“for this in that:”迭代器似乎不合适,但也许itertools可以很容易地做到这一点(我不熟悉) 我想这个解决方案即使是新手程序员/脚本编写者也知道,但我不知道 谢谢我想这段代码可以满足您的需求: &

我有10个任意字母,需要检查Word文件中的最大长度匹配

  • 我不久前才开始学习RE,似乎找不到合适的模式

    • 第一个想法是使用set:[10个字符],但它也会重复包含的字符,我不知道如何避免这种情况
  • 我最近开始学习Python,但在RE之前,可能不需要RE,这可以不用它解决

    • 使用“for this in that:”迭代器似乎不合适,但也许itertools可以很容易地做到这一点(我不熟悉)
  • 我想这个解决方案即使是新手程序员/脚本编写者也知道,但我不知道
    谢谢

    我想这段代码可以满足您的需求:

    >>> words = open('file.txt')
    >>> max(len(word) for word in set(words.split()))
    
    如果您需要更复杂的标记化,例如,如果您不使用拉丁语文本,则应使用:


    我想你是想从你的10个任意字母中找出最长的单词

    你可以将你的10个任意字母和它们出现的频率一起保存在一个dict中

    e、 例如,您的4(为了简单起见,使用4而不是10)任意字母是:e、w、l、l。这将在一份口述中表述为: {'e':1,'w':1,'l':2}

    然后针对文本文件中的每个单词,查看该单词的所有字母是否都可以在任意字母的dict中找到。如果是这样,那么这就是你的候选词之一

    因此: 我们 墙 嗯


    well中的所有字母都可以在任意字母的dict中找到,因此请保存它及其长度,以便与其他单词进行比较。

    我猜这类似于在给定一组拼字块的情况下查找可能的单词,以便一个字符只能重复原始列表中重复的次数

    诀窍是根据包含源字母的集合有效地测试word文件中每个单词的每个字符。对于每个字符,如果在测试集中找到,则将其从测试集中删除并继续;否则,该单词不匹配,请继续下一个单词

    Python有一个很好的函数
    all
    ,用于基于序列中的元素测试一组条件
    all
    增加了一个功能,即它将“短路”,即,一旦一个项目出现故障,则不再进行测试。因此,如果你的候选词的第一个字母是“z”,而源字母中没有“z”,那么测试候选词中的任何其他字母就没有意义了

    我写这篇文章的第一个机会很简单:

    matches = []
    for word in wordlist:
        testset = set(letters)
        if all(c in testset for c in word):
            matches.append(word)
    
    不幸的是,这里的错误是,如果源字母包含一个“m”,那么一个单词和几个“m”会错误地匹配,因为每个“m”都会分别匹配源测试集中给定的“m”。所以我需要删除匹配的每个字母

    我利用了
    set.remove(item)
    返回None这一事实,Python将其视为布尔值
    False
    ,并扩展了调用
    all
    时使用的生成器表达式。对于word中的每个c,如果在testset中找到它,我还想从testset中删除它,类似(伪代码,非有效Python):

    由于set.remove返回None,我可以用“not testset.remove(c)”替换上面引用的位,现在我有了一个有效的Python表达式:

    all(c in testset and not testset.remove(c) for c in word)
    
    现在,我们只需要将其包装在一个循环中,以检查列表中的每个单词(确保在检查每个单词之前构建一个新的测试集,因为我们的
    all
    测试现在已成为破坏性测试):

    最后一步是按长度降序排列匹配项。我们可以传递一个键函数进行排序。内置的
    len
    会很好,但这将按升序长度排序。要将其更改为降序排序,我们使用lambda来提供的不是
    len
    ,而是
    -1*len

    matches.sort(key=lambda wd: -len(wd))
    
    现在,您可以在匹配项[0]处打印出最长的单词,或者迭代所有匹配项并打印出来


    (我很惊讶这种蛮力方法运行得如此之好。我使用了包含80000多个单词的2of12inf.txt单词列表,对于10个字符的列表,我在我的1.99GHz小笔记本电脑上大约0.8秒就找到了匹配的列表。)

    你只是在word文件中找到了最长的单词。我想他在找字谜。啊,我明白了/你能举个例子说明你在寻找什么样的匹配吗?当你说“最大长度”匹配10个字母时,你是指仅使用这10个字母的组合或仅使用其中一个字母的延伸的最大长度单词(即,如果你的字母表为10个字母={abcdefghij},AAAA是匹配的,但abcde不是匹配的)此外,这10个字母中的每一个字母只能使用一次或任意次数。例如:我将“ALECETRONE”作为参数传递,并获得最大长度的单词,如“ELECTRON”在本例中,字母仅在所有答案中使用一次,是的,这就是我试图解决的Word文件有400000个单词,我正在寻找合适的迭代器算法的情况。下面是列表:“l=open('dict.dat','r').readlines()+谢谢你的回答和精彩的演讲,但不幸的是我不能让它匹配任何东西。这是我的简单代码(用6个字母代替10个字母):我从来没有用过全部()函数,但我不确定我是否再次清楚该任务,因此我将再试一次解释:假设你有10个字母,你的任务是找到你能用这些字母造出的最长单词。有时最长单词是8个字母,有时或多或少我会尝试让它为我工作,然后发布我的结果。你正在使用readlines()以获取dict.dat的内容。此函数在每一行附加“\n”。请尝试阅读().splitlines()。:)太好了!我还有一个英雄-Paul McGuire。谢谢你,我很高兴它现在可以工作了,多亏了你的慷慨帮助和打包在两行代码中的优雅而快速的解决方案:)如果我看得更远,这是因为我站在巨人的脚尖上。很高兴它成功了!:)对于
    all(c in testset and not testset.remove(c) for c in word)
    
    for word in wordlist:
        testset = set(letters)
        if all(c in testset and not testset.remove(c) for c in word):
            matches.append(word)
    
    matches.sort(key=lambda wd: -len(wd))