2017-05-23 18 views
-2

我可能无法清楚解释。 我想要有一个比较函数来确定2个列表中相同索引的值是否相同。如何在Python中比较2个列表的准确性?

例如,2个列表A和B应该相同(准确率= 100%)。

A=[1,2,1,1,3,4,3,2,5]  
B=[4,2,4,4,3,1,3,2,5] 

因为A(0),A(2),A(3)相同的值= 1,B(0),B(2),B(3)是相同的值= 4 ; A(1),A(7)是相同的值= 2,与B(1),B(7)相同; (4),A(6)是相同的值= 3,与B(4),B(6)相同; A(5),列表A中的唯一值与B(5)相同; A(8),列表A中的唯一值与B(8)相同。

然后采取相同的规则列表C & D,其准确度应该是80%。

C=[1,2,2,2,3,4,4,4,5,6] 
D=[3,4,4,4,1,5,5,6,5,6] 

d(7)应该是相同的值作为d(5),d(6),不与d相同的(9)和d(8)不应该是相同的值作为d( 5),D(6),这应该是一个独立的值。

注意:列表中的值可能不是连续编号。列表A罐 也可以是[1,26,1,1,30,4,30,26,5],B可以是[4,22,4,4,3,100,3,22,5]。 我仍然认为它们是一样的。

如何获得比较函数的检查精度? 谢谢!

+0

我不明白为什么'A'和'B'应该有100%的“准确率”。这不意味着名单是平等的吗?不过,'A'和'B'并不相同。 – timgeb

+0

[两个列表的重叠百分比]可能的重复(https://stackoverflow.com/questions/29929074/percentage-overlap-of-two-lists) –

+0

那么在第六个索引(索引= 5)的情况下'A'和'B'?那里似乎没有任何模式,那么你可以扩展一下“准确度”的定义吗? – blacksite

回答

2

如果你想交集的长度比较并集的长度:

  • 多少元素在两个列表? (设定十字路口&
  • 总共有几个元素? (并集|

此方法不采取立场或分发到:

A = [1, 2, 1, 1, 3, 4, 3, 2, 5] 
B = [4, 2, 4, 4, 3, 1, 3, 2, 5] 

C = [1, 2, 2, 2, 3, 4, 4, 4, 5, 6] 
D = [3, 4, 4, 4, 1, 5, 5, 6, 5, 6] 

def overlapping_percentage(x, y): 
    return (100.0 * len(set(x) & set(y)))/len(set(x) | set(y)) 

print(overlapping_percentage(A, B)) 
# 100.0 
print(overlapping_percentage(C, D)) 
# 83.3 
+0

感谢您的好评!如果D = [3,4,4,1,5,5,2,5,6],那么overlap_percentage(C,D)将是100%。我认为D(7)= 2的值不同于D(5)&D(6)= 5。 –

+0

@ karenwu:对不起,看来我没有得到你的问题。我的方法只关心独特的元素,而不关心其分布或地点。 –

0

这里有一个不同的方法,这可能是更接近你想要什么。这并不完美,你可能需要优化它。

说实话,我不明白这些80%来自哪里。

此方法从列表中提取“指纹”:元素放置在哪里,与其值无关。然后将指纹相互比较:

from collections import defaultdict 

A=[1,2,1,1,3,4,3,2,5] 
B=[4,2,4,4,3,1,3,2,5] 

C = [1, 2, 2, 2, 3, 4, 4, 4, 5, 6] 
D = [3, 4, 4, 4, 1, 5, 5, 6, 5, 6] 

def fingerprint(lst): 
    r = defaultdict(list) 
    for i,x in enumerate(lst): 
     r[x].append(i) 
    return sorted(r.values()) 

fA = fingerprint(A) 
# [[0, 2, 3], [1, 7], [4, 6], [5], [8]] 
fB = fingerprint(B) 
# [[0, 2, 3], [1, 7], [4, 6], [5], [8]] 
fC = fingerprint(C) 
# [[0], [1, 2, 3], [4], [5, 6, 7], [8], [9]] 
fD = fingerprint(D) 
# [[0], [1, 2, 3], [4], [5, 6, 8], [7, 9]] 

print((100.0*sum(1 for a,b in zip(fA, fB) if a == b)/len(fB))) 
# 100.0 

print((100.0*sum(1 for c,d in zip(fC, fD) if c == d)/len(fD))) 
# 60.0 
+0

感谢您的好评!我会先尝试一下。 –