【发布时间】:2015-11-23 17:22:23
【问题描述】:
我有一个字典,其中名称作为键,出现位置的相应列表作为值。 我想合并等效名称。这些名称以前没有添加到其真正的字典键中,因为它们写得不好(例如拼写错误)。 因此,Sorted_tuple 是从 Dict.items() 中提取的排序元组,并进行排序以使第一个元素是包含更多出现次数的元素。 我写了以下代码,但速度很慢。我怎样才能让它更快? 谢谢
注意:check_list 的存在是为了当第一个循环到达之前已经比较过的第 i 个名称时,它不会计算与接下来的名称的距离函数。示例:如果已经发现第 10 个名称与第 1 个等价,则无需将第 10 个与 11,12 等进行比较。
编辑:玩具示例
EDIT2:来自 i+1 的 j
Dict = {'Pedro':[1,3,4,7,8,10],'Ana':[2,6,9],'Pedros':[5]}
sorted_tuple = sorted(Dict.items(),key=lambda x:len(x[1]),reverse=True)
check_list = [0]*len(Sorted_tuple)
for i in range(len(Sorted_tuple)):
for j in range(i+1,len(Sorted_tuple)):
Name_i = Sorted_tuple[i][0]
Name_j = Sorted_tuple[j][0]
ID_list_j = Sorted_tuple[j][1]
if check_list[i] == 0:
if distance(Name_i,Name_j) < 5:
Dict[Name_i]+=ID_list_j
check_list[j] = 1
else: continue
else:
continue
【问题讨论】:
-
一个玩具例子会有所帮助。
-
应该'for j in range(1,len(Sorted_tuple)):'实际上是'for j in range(i+1,len(Sorted_tuple)):'?即 j 从 i+1 到长度。我也应该从 0 到 len(Sorted_tuple)-1。
-
是的,对不起。它是'for j in range(i+1,len(Sorted_tuple))'
-
你可以对 n log n 运行时的排序列表一分为二,你的继续也是没有意义的
-
对此不确定,但通过离开合并直到您拥有所有不同的名称,您将不得不执行 O(n^2) 比较。如果在收集名称时合并名称会怎样?假设 25% 的名称合并,进行这些比较的成本为 O((0.75n)^2) - 即大约两倍。
标签: python performance for-loop