[英]Unexpected output in for loop - Python
我有这个清单:
t=[['universitario de deportes'],['lancaster'],['universitario de'],['juan aurich'],['muni'],['juan']]
我想根据抽卡距离对列表重新排序。 如果我重新排序t
的预期输出中应该是:
[['universitario de deportes'],['universitario de'],['lancaster'],['juan aurich'],['juan'],['muni']]
插孔距离的代码可以正常工作,但其余代码未提供预期的输出,代码如下:
def jack(a,b):
x=a.split()
y=b.split()
k=float(len(set(x)&set(y)))/float(len((set(x) | set(y))))
return k
t=[['universitario de deportes'],['lancaster'],['universitario de'],['juan aurich'],['muni'],['juan']]
import copy as cp
b=cp.deepcopy(t)
c=[]
while (len(b)>0):
c.append(b[0][0])
d=b[0][0]
del b[0]
for m in range (0 , len(b)+1):
if m > len(b):
break
if jack(d,b[m][0])>0.3:
c.append(b[m][0])
del b[m]
不幸的是,意外的输出是相同的列表:
print c
['universitario de deportes', 'lancaster', 'universitario de', 'juan aurich', 'muni', 'juan']
编辑:
我试图更正我的代码,但是它也没有起作用,但是我离预期的输出有点接近:
t=[['universitario de deportes'],['lancaster'],['universitario de'],['juan aurich'],['muni'],['juan']]
import copy as cp
b=cp.deepcopy(t)
c=[]
while (len(b)>0):
c.append(b[0][0])
d=b[0][0]
del b[0]
for m in range(0,len(b)-1):
if jack(d,b[m][0])>0.3:
c.append(b[m][0])
del b[m]
“关闭”输出为:
['universitario de deportes', 'universitario de', 'lancaster', 'juan aurich', 'muni', 'juan']
第二编辑:
最后,我想出了一种计算速度非常快的解决方案。 目前,我将使用该代码订购6万个名称。 代码如下:
t=['universitario de deportes','lancaster','lancaste','juan aurich','lancaster','juan','universitario','juan franco']
import copy as cp
b=cp.deepcopy(t)
c=[]
while (len(b)>0):
c.append(b[0])
e=b[0]
del b[0]
for val in b:
if jack(e,val)>0.3:
c.append(val)
b.remove(val)
print c
['universitario de deportes', 'universitario', 'lancaster', 'lancaster', 'lancaste', 'juan aurich', 'juan', 'juan franco'
首先,不确定为什么要在单项列表中包含所有内容,因此我建议先将其展平:
t = [l[0] for l in t]
这消除了各处多余的零索引,这意味着您只需要浅表副本(因为字符串是不可变的)。
其次,代码的最后三行永远不会运行:
if m > len(b):
break # nothing after this will happen
if jack(d,b[m][0])>0.3:
c.append(b[m][0])
del b[m]
我认为您想要的是:
out = [] # this will be the sorted list
for index, val1 in enumerate(t): # work through each item in the original list
if val1 not in out: # if we haven't already put this item in the new list
out.append(val1) # put this item in the new list
for val2 in t[index+1:]: # search the rest of the list
if val2 not in out: # if we haven't already put this item in the new list
jack(val1, val2) > 0.3: # and the new item is close to the current item
out.append(val2) # add the new item too
这给我
out == ['universitario de deportes', 'universitario de',
'lancaster', 'juan aurich', 'juan', 'muni']
我通常建议使用比a
, b
, c
等更好的变量名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.