两个列表的重叠百分比

One*_*iot 12 python list similarity overlap

这是一个数学问题而不是其他任何问题.假设我在Python中有两个不同大小的列表

listA = ["Alice", "Bob", "Joe"]
listB = ["Joe", "Bob", "Alice", "Ken"]
Run Code Online (Sandbox Code Playgroud)

我想知道这两个列表有多少重叠百分比.订单在列表中并不重要.找到重叠是很容易的,我已经看过其他关于如何做到的帖子,但我无法在脑海中扩展它以找出它们重叠的百分比.如果我按照不同的顺序比较列表,结果会有不同的结果吗?这样做的最佳方式是什么?

gec*_*kon 9

从主要观点来看,我会说你可能会问两个明智的问题:

  1. 与第一个列表相比,重叠的百分比是多少?也就是说,与第一个列表相比,共同部分有多大?
  2. 第二个列表也是一样的.
  3. 如果与"宇宙"(即两个列表的并集)相比,重叠的百分比是多少?

肯定会发现其他含义,并且会有很多含义.总而言之,你应该知道你想要解决的问题.

从编程的角度来看,解决方案很简单:

listA = ["Alice", "Bob", "Joe"]
listB = ["Joe", "Bob", "Alice", "Ken"]

setA = set(listA)
setB = set(listB)

overlap = setA & setB
universe = setA | setB

result1 = float(len(overlap)) / len(setA) * 100
result2 = float(len(overlap)) / len(setB) * 100
result3 = float(len(overlap)) / len(universe) * 100
Run Code Online (Sandbox Code Playgroud)


Jun*_*sor 6

最大差异是两个列表具有完全不同的元素.所以我们最多有n + m离散元素,其中n第一个列表m的大小是第二个列表的大小.一项措施可以是:

2 * c / (n + m)
Run Code Online (Sandbox Code Playgroud)

c常见元素的数量在哪里.这可以像这样计算为百分比:

200.0 * len(set(listA) & set(listB)) / (len(listA) + len(listB))
Run Code Online (Sandbox Code Playgroud)

  • 以下示例失败: listA = ["Alice", "Alice"] listB = ["Alice", "Alice"] (2认同)

Ofi*_*ris 6

>>> len(set(listA)&set(listB)) / float(len(set(listA) | set(listB))) * 100
75.0
Run Code Online (Sandbox Code Playgroud)

我会从不同的项目总数中计算出共同的项目。

len(set(listA)&set(listB)) 返回常见项目(示例中为3)。

len(set(listA) | set(listB)) 返回不重复项的总数(4)。

乘以100,您将得到百分比。