我有一个包含某些元素的列表,例如l=[10,10,40,10,40]
。
现在,我想计算一对具有相同值的索引,就像上面的示例中索引0和1,索引0和3,索引1和3以及最后索引2和4具有相同的值一样,所以我的计数变为4。
我正在使用以下代码执行相同的操作。
for i in range(len(l)):
for j in range(i+1, len(l)):
if l[i]==l[j]:
count += 1
这需要O(n ^ 2)时间,有人可以建议我采用更快的方法吗?
答案 0 :(得分:0)
看起来您想要的是提供的列表中每个唯一值的索引的组合总数。
可以从factorial(n) / factorial(r) / factorial(n-r)
计算出组合的数量,其中n
是索引列表的长度,而r
是要组合的值的数量。因此,以您的列表为例,我们将得到:
10: indexes 0, 1, 3 -> n = 3
40: indexes 2, 4 -> n = 2
r
始终等于2,因为我们正在提取对。要在Python代码中重现此代码,我们可以执行以下操作:
from collections import Counter
from math import factorial
def nCr(n, r):
return int(factorial(n) / factorial(r) / factorial(n-r))
def count_pairs(elements):
values = Counter(elements).values()
return sum([nCr(i, 2) for i in values])
Counter将对您的列表进行一次迭代,将提供的列表(计数器的键)中的每个值映射到列表中出现的次数(计数器的值)。然后,对于每个出现的次数,我们通过nCr()
方法计算出其组合的数量,然后将其全部求和。
使用示例函数调用count_pairs()
将返回所需的值4。