我想比较两个列表(结果,真实情况)。如果两者都匹配,则输出应包含1;如果不匹配,则输出应包含1,并且输出正敏感信号。例如:
result= [1,2,3,4,5]
ground-truth=[2,4]
Output= [0,1,0,1,0]
我为此实现了python代码:
def comparedkeground(dke,grd):
correct=np.zeros(len(dke))
try:
for i in range(len(grd)):
a=dke.index(grd[i])
correct[a]=1
except:
'ValueError'
return correct
在某些情况下,此代码可提供理想的结果:例如:
d=[1,2,30,4,6, 8, 50, 90, 121]
e=[30, 2, 50, 90]
print(comparedkeground(d,e))
[0. 1. 1. 0. 0. 0. 1. 1. 0.]
cc=['word', 'flags', 'tv', 'nanjo', 'panjo']
ccc=['panjo', 'tv']
print(comparedkeground(cc,ccc))
[0. 0. 1. 0. 1.]
但是相同的代码不起作用:
u=['Lyme-disease vaccine', 'United States', 'Lyme disease', 'Allen Steere']
u1= ['drugs', 'Lyme-disease vaccine', 'Lyme disease']
print(comparedkeground(u,u1))
[0. 0. 0. 0.]
答案 0 :(得分:2)
这是因为u
数组没有'drugs'
值,并且dke.index(grd[i])
的输出将是错误的!您将try
语句放置在错误的位置,您必须像这样更改它:
def comparedkeground(dke,grd):
correct=np.zeros(len(dke))
for i in range(len(grd)):
try:
a=dke.index(grd[i])
correct[a]=1
except:
'ValueError'
return correct
答案 1 :(得分:1)
如果您正在运行python3,请尝试:
def comparedkeground(dke, grd):
return [int(i in grd) for i in dke]
答案 2 :(得分:0)
这是因为当主列表中不存在该元素时,循环中就会发生错误,该错误会停止执行当前的for循环,但尚未检查数组的其余部分,
因此,您可以像这样将try catch
块向内移动一点
import numpy as np
def comparedkeground(dke,grd):
correct=np.zeros(len(dke))
for i in range(len(grd)):
try:
a=dke.index(grd[i])
correct[a]=1
except:
'ValueError'
return correct
u=['Lyme-disease vaccine', 'United States', 'Lyme disease', 'Allen Steere']
u1= ['drugs', 'Lyme-disease vaccine', 'Lyme disease']
print(comparedkeground(u,u1))
输出
[ 1. 0. 1. 0.]
我将try块移入了内部,因为如果找不到当前元素,则应该在列表中搜索下一个元素,因此应该为下一次迭代提供循环,因此应该在其中处理任何错误。迭代本身。