如何准确比较python中的2个列表?

时间:2017-05-23 12:40:38

标签: 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中的(5)唯一值与B(5)相同; 列表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)应与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]。   我仍然认为它们是相同的。

如何检查比较功能的准确性? 谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

回答还为时已晚,但是我以另一种方式做了同样的事情,您可以计算与相同索引中的另一个列表相同的数字的每个百分比。

我只给您我的代码,您可以参考它。

def accuracy(self,*args):
        check = final_result['train_num'] == final_result['test_num']
        passed = final_result[check]
        accuracy = len(passed.index) / len(final_result.index)
        analysis = passed['test_num'].value_counts()
        analysis = analysis / 50  
        analysis['accuracy']=round(accuracy,5)
        pd.Series.to_csv(analysis,csvpath+"accuracy.csv",sep=',')
        print("accuracy:{:.3f}".format(accuracy))

train_num test_num是数据框final_result的2列,您可以将其替换为数据。

要小心,使用analysis = analysis / 50 50 是数据中每个元素的总度,您应该更改它。