2017-05-23 43 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

感謝您的好評!我會先嚐試一下。 –