计算值彼此相邻出现的次数

时间:2019-09-29 11:36:30

标签: python list counting

我有一个看起来像这样的列表:

['C', 'C', 'H', 'H', 'E', 'H', 'C', 'C', 'C', 'H', 'H', 'C', 'H', 'H', 'H', 'H', 'C']

我想能够计算出彼此相邻的一个,两个或三个H出现的次数,但没有其他数字可以计数。

因此在上面的示例中,HHH出现0次,HH出现两次,H出现一次。

我试图建立一个for循环,该循环在当前位置和先前位置上进行迭代,但是我觉得这太长了。

2 个答案:

答案 0 :(得分:2)

您可以使用defaultdictgroupby做这样的事情:

from collections import defaultdict
from itertools import groupby

lst = ['C', 'C', 'H', 'H', 'E', 'H', 'C', 'C', 'C', 'H', 'H', 'C', 'H', 'H', 'H', 'H', 'C']

counts = defaultdict(int)
for _, group in groupby(lst):
    s = ''.join(group)
    if len(s) < 4:
        counts[s] += 1

print(counts)

输出

{'CC': 1, 'HH': 2, 'E': 1, 'H': 1, 'CCC': 1, 'C': 2}

这个想法是用groupby查找连续字母的 run 并将计数存储在字典中,在本例中为defaultdict。

答案 1 :(得分:0)

也许是这样?它打印出所有紧挨着出现的数字H。

X = ['C', 'C', 'H', 'H', 'E', 'H', 'C', 'C', 'C', 'H', 'H', 'C', 'H', 'H', 'H', 'H', 'C']
from collections import Counter
def cnt(X,c):
    i = 0
    count = Counter()
    temp = 0 #temporary variable to store counter
    while i < len(X):
        if X[i] != c:
            i += 1
        else:
            while i < len(X) and X[i] == c: #keep looping until end of array or different character
                temp += 1
                i += 1
            count[temp] += 1
            temp = 0
    print(count)
cnt(X,'H')

#Counter({2: 2, 1: 1, 4: 1})