假设我有2个Python列表x
和y
,它们的长度为N
。
如果x_i
> x_j
是y_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
答案 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个元素。
注意:这是假设x
和y
的长度相同。如果不是,请使用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