Python 3:非常难(至少对我来说)大学关于拟声词的作业。

问题描述 投票:1回答:1

我有这个功课,把我堵死了。其实我找到了一个解决方法,效果很好,但只有当要分析的数据不是很大的时候。

我有一个字符串列表,其中每一个词都是其他一些词的异构,我们称之为 "生成器".对于每一个 "生成器",相关的字符串可以是它的异构或异构+1个字母.我需要找到有最大数量相关词的 "生成器".

这个例子可以更好的解释。

这些字符串是:

  • trota
  • 筹码
  • 箭头
  • parto
  • 芋头
  • 脚踏车
  • 腐烂
  • 舷窗

最大字数的 "生成器 "是'箭头'(或它的字形)和相关的词是。

  • arto
  • 尔塔
  • 帕尔托('arto'的变形词+字母p)
  • 波尔塔('arto'的字形)
  • 烂陀
  • 芋头
  • 沱沱车

排除的词是 "tratto "和 "trotta",因为太长。

可能是 "生成器 "没有包含在最终结果中,例如。

  • beel
  • 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-3百个或者字符串很长的时候,我的程序就会耗费很多秒或者几分钟.你有什么更好的办法来找到这些词吗? 谢谢!

python python-3.x anagram
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.