Python:计算2个列表之间的一致性百分比?

时间:2019-05-17 02:15:17

标签: python

假设我有2个Python列表xy,它们的长度为N

如果x_i> x_jy_i> y_j,则一致性定义为

例如,如果x是学生的成绩列表,而y是他们毕业后的薪水列表,则一致性表示学生A的得分>学生B-> A的收入将超过B(反之亦然)。

我如何才能(有效地)计算两个列表之间的一致性百分比(总共有N*(N-1)/2对)?

添加示例:

考虑2个列表:

x = 2,3,1 y = 1,2,3

x0

x0> x2和y0

x1> x2和y1

所以最终,一致性百分比= 1/3

1 个答案:

答案 0 :(得分:1)

基本上,您需要找到x和y的可能组合

>>> from itertools import combinations                 
>>> x
[2, 3, 1]
>>> y
[1, 2, 3]
>>> combinations(x,2)
<itertools.combinations object at 0x1010482b8>
>>> combinations(y,2)
<itertools.combinations object at 0x101048208>
>>> list(combinations(x,2))
[(2, 3), (2, 1), (3, 1)]
>>> list(combinations(y,2))
[(1, 2), (1, 3), (2, 3)]

然后为上述列表/迭代器中的所有值找到a<b

>>> ["a<b" if a<b else "a>b" for a,b in combinations(x,2)]
['a<b', 'a>b', 'a>b']
>>> ["a<b" if a<b else "a>b" for a,b in combinations(y,2)]
['a<b', 'a<b', 'a<b']

然后zip个。

  

此函数返回一个元组列表,其中第i个元组包含   每个自变量序列或可迭代对象的第i个元素。

注意:这是假设xy的长度相同。如果不是,请使用izip_longest中的itertools

>>> zip(["a<b" if a<b else "a>b" for a,b in combinations(x,2)],["a<b" if a<b else "a>b" for a,b in combinations(y,2)])
[('a<b', 'a<b'), ('a>b', 'a<b'), ('a>b', 'a<b')]

然后,找到concordance_count

>>> [1 if v1==v2 else 0 for v1,v2 in zip(('a<b' if a<b else "a>b" for a,b in combinations(x,2)), ('a<b' if a<b else "a>b" for a,b in combinations(y,2)))]
[1, 0, 0]
>>> concordance_count = sum(1 if v1==v2 else 0 for v1,v2 in zip(('a<b' if a<b else "a>b" for a,b in combinations(x,2)), ('a<b' if a<b else "a>b" for a,b in combinations(y,2))))
>>> concordance_count
1
>>> concordance_percentage = concordance_count/max(len(x),len(y))
>>> concordance_percentage
1/3