我有这个功课,把我堵死了。其实我找到了一个解决方法,效果很好,但只有当要分析的数据不是很大的时候。
我有一个字符串列表,其中每一个词都是其他一些词的异构,我们称之为 "生成器".对于每一个 "生成器",相关的字符串可以是它的异构或异构+1个字母.我需要找到有最大数量相关词的 "生成器".
这个例子可以更好的解释。
这些字符串是:
最大字数的 "生成器 "是'箭头'(或它的字形)和相关的词是。
排除的词是 "tratto "和 "trotta",因为太长。
可能是 "生成器 "没有包含在最终结果中,例如。
这个 "发电机 "就是'。蜜蜂'
这是我的解决方案。
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百个或者字符串很长的时候,我的程序就会耗费很多秒或者几分钟.你有什么更好的办法来找到这些词吗? 谢谢!
提示:计算你输入的每个字中每个字符的出现次数。你能只用这个方法有效地解决这个问题吗?如:.
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