我有一个看起来像这样的列表:
['C', 'C', 'H', 'H', 'E', 'H', 'C', 'C', 'C', 'H', 'H', 'C', 'H', 'H', 'H', 'H', 'C']
我想能够计算出彼此相邻的一个,两个或三个H出现的次数,但没有其他数字可以计数。
因此在上面的示例中,HHH出现0次,HH出现两次,H出现一次。
我试图建立一个for循环,该循环在当前位置和先前位置上进行迭代,但是我觉得这太长了。
答案 0 :(得分:2)
您可以使用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查找连续字母的 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})