2017-05-23 8 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)と同じである。 A(4)、A(6)は同じ値= 3であり、B(4)、B(6)と同じである。 リストAの一意の値A(5)はB(5)と同じです。 リストAの一意の値A(8)は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)((5)、D(6)は、Dと同じではない(9)、及びD(8)Dと同じ値であるべきではない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

[2つのリストの割合の重複]の可能な複製(https://stackoverflow.com/questions/29929074/percentage-overlap-of-two-lists) –

+0

6番目のインデックス(インデックス= 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,5,1,2,3,4]、重複率(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

すばらしい答えをありがとう!私はまずそれを試してみるでしょう。 –

関連する問題