在python

时间:2019-07-12 18:43:24

标签: python-3.x

我有一个包含某些元素的列表,例如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)时间,有人可以建议我采用更快的方法吗?

1 个答案:

答案 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。