Python 3:关于字谜的大学作业非常困难(至少对我而言)

Posted

技术标签:

【中文标题】Python 3:关于字谜的大学作业非常困难(至少对我而言)【英文标题】:Python 3: very difficult (at least for me) university homework about anagrams 【发布时间】:2020-08-10 05:08:11 【问题描述】:

我有这个功课阻碍了我。我实际上找到了一个可以正常工作的解决方案,但前提是要分析的数据不是很大。

我有一个字符串列表,其中每个单词都是我们称之为“生成器”的其他一些单词的字谜。 对于每个“生成器”,相关的字符串可以是它的字谜或字谜 + 1 个字母。 我需要找到相关词数最多的“生成器”。

这个例子解释得更好:

字符串是:

特洛塔 曲子 艺术 部分 芋头 小跑 罗塔 奥尔塔 门

最大单词数的“生成器”是'arto'(或者是字谜),相关的单词是:

艺术 orta('arto' 的字谜) parto('arto' + 字母 p 的变位词) porta('arto' + 字母 p 的变位词) rotta('arto' + 字母 t 的变位词) 芋头('arto' 的变位词) trota('arto' + 字母 t 的变位词)

排除的词是“tratto”和“trotta”,因为它们太长了。

可能是“生成器”没有包含在最终结果中,例如:

比尔 baee 蜜蜂

“生成器”是“蜜蜂

这是我的解决方案:

def open_r(ftesto_in):
    lista = []
    with open(ftesto_in, encoding='utf8') as f:
        for word in f:
            lista.append(word.strip())
    return lista

def es(ftesto_in):
    lista=open_r(ftesto_in)
    d = 
    for i in range(len(lista)):
        a = lista[i]
        for j in range(i+1, len(lista)):
            b = lista[j]
            if len(a) == len(b) or len(a) == len(b)+1 or len(a) == len(b)-1:
                    gen = tuple(generator(a,b))
                    if len(gen) == len(a) or len(gen) == len(a)-1:
                        dic_upd(d, gen, a)
                    if len(gen) == len(b) or len(gen) == len(b)-1:
                        dic_upd(d, gen, b)                           
    d = k: list(set(v)) for k, v in d.items()
    result = maximum(d)
    return result

def dic_upd(d,k,v):
    if k not in d:
        d[k] = [v]
    else:
        d[k].append(v)

def maximum(d):
    result = 0
    lista = []
    for k,v in d.items():
        count = len(v)
        if count > result:
            result = count
            lista.clear()
            for i in v:
               lista.append(i)
    return lista


def generator(a,b):
    res = []
    a = list(a)
    b = list(b)
    for i in a:
        if i in b:
            res.append(i)
            b.remove(i)
    return sorted(res)

当字符串的数量超过 2-300 或者字符串很长时,我的程序会花费很多秒或分钟。 你有更好的想法如何找到这些词吗? 谢谢!

【问题讨论】:

【参考方案1】:

提示:计算输入中每​​个字符的出现次数,每个单词。您可以仅使用它有效地解决问题吗?例如:

        a  o  p  r  t
trota   1  1  0  1  2
tratto  1  1  0  1  3
arto    1  1  0  1  1
parto   1  1  1  1  1
taro    1  1  0  1  1
trotta  1  1  0  1  3
rotta   1  1  0  1  2
orta    1  1  0  1  1
porta   1  1  1  1  1

【讨论】:

我不确定你的意思。如果范围是准确地找到字谜,我可以计算字母并放入字典,但在这种情况下,你如何用你的方法聚合这三个单词? “rotta 1 1 0 1 2”“orta 1 1 0 1 1”“porta 1 1 1 1 1” @MarioL 一次解决一列。例如,当查看“a”列时,您会看到每个单词都有 1 个“a”,这样就很容易了:您的解决方案单词正好包含 1 个“a”。如果这不是那么容易,您将不得不选择 k 以使该列中最多的单词有 k。我会把 +1 额外的字母留给你作为练习。

以上是关于Python 3:关于字谜的大学作业非常困难(至少对我而言)的主要内容,如果未能解决你的问题,请参考以下文章

河北大学python选修课00次作业

while循环检查python中的字谜

确定某物是不是是字谜的功能问题[关闭]

字谜Python 3 [关闭]

字符串数组只包含字谜?

Python:字谜查找器