Посчитайте, сколько раз значения появляются рядом друг с другом - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть список, который выглядит следующим образом:

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

, и я хочу иметь возможность подсчитать, сколько раз один, два или три буквы H появляются рядом друг с другом, но ничего выше этого.

Таким образом, в приведенном выше примере HHH появляется 0 раз, HH появляется два раза, а H появляется один раз.

Я пытался построить цикл for, который повторяет текущую и предыдущую позициюно я чувствую, что это слишком долго.

Ответы [ 2 ]

2 голосов
/ 29 сентября 2019

Вы можете сделать что-то подобное, используя defaultdict и groupby :

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 и сохранить счет в словаре, в данном случае по умолчанию.

0 голосов
/ 29 сентября 2019

Нечто подобное может быть?На ней печатаются все числа 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})
...