python-统计列表中类似AABB的出现次数

python-统计列表中类似AABB的出现次数,python,algorithm,Python,Algorithm,我的清单如下: a=[0,0,2,4,4,6,6,9,12,13,13,16,16,21,21,24,26,26,28,28,31,34,34,37,37] 该列表满足: 1.按升序排序 2.每个数字出现1-2次 如何统计列表中所有类似AABB的事件 在上面的例子中,答案应该是5 (4,4,6,6)(13,13,16,16)(16,16,21,21)(26,26,28,28)(34,34,37,37)虽然一开始看起来不是这样(因为您正在处理INT列表),但实际上这是一个示例 如果你看维基百科的

我的清单如下:

a=[0,0,2,4,4,6,6,9,12,13,13,16,16,21,21,24,26,26,28,28,31,34,34,37,37]
该列表满足:

1.按升序排序

2.每个数字出现1-2次

如何统计列表中所有类似AABB的事件

在上面的例子中,答案应该是
5


(4,4,6,6)(13,13,16,16)(16,16,21,21)(26,26,28,28)(34,34,37,37)

虽然一开始看起来不是这样(因为您正在处理INT列表),但实际上这是一个示例

如果你看维基百科的文章(链接到上面),你会发现这种算法有很多用途,不仅仅是搜索字符串,一个主要的用途是搜索给定模式的DNA序列,因此它是计算机科学的一个相当重要的领域

除了多种用途之外,还有多种实现,因此您可以通过多种方式来实现这一点

简单的方法是遍历列表,检查下一个元素是否与当前元素匹配,然后检查以下元素是否也匹配。这里的问题是,您必须遍历整个列表,然后遍历每个子列表,以检查它是否与给定的模式匹配。在大O表示法中,我们说这种方法的复杂性为
O(nm)
,其中n是列表的长度,m是您正在搜索的模式的长度,因此它不是非常有效


有很多方法可以改进这种幼稚的方法,甚至有些方法是未知的。我将把这个问题留给你去解决,但希望这能给你一些建议。

有很多方法可以做到这一点。我能想到的最简单的方法是使用“枚举”和列表理解,并附带一个条件来测试“aabb”模式

result = len([x for idx,x in enumerate(a) if idx<len(a)-3 and x == a[idx+1] and x!=a[idx+2] and a[idx+2] == a[idx+3]])

result=len([x代表idx,枚举(a)中的x)如果idx只需循环-并比较对

a=[0,0,2,4,4,6,6,9,12,13,13,16,16,21,21,24,26,26,28,28,31,34,34,37,37]
for i in range(len(a)-3):
  if (a[i]==a[i+1] and a[i+2]==a[i+3]):
    print(str(a[i])+str(a[i+1])+str(a[i+2])+str(a[i+3]))

您可以从编写一些代码开始;)@Loser For
0,0
必须是
0,0,2,2
,但它是
0,0,2,4