这是一种使用collections.Counter的方法:
假设您提供的字符串存储在变量s 中。
首先我们遍历s 中所有小写字母的集合。我们通过创建另一个字符串s_lower 来做到这一点,它将字符串s 转换为小写。然后我们用 set 构造函数包装它以获取唯一值。
对于每个char,我们遍历字符串并检查前一个字母是否等于char。如果是这样,我们将其存储在一个列表中。最后,我们将此列表传递给 collections.Counter 构造函数,它将计算出现次数。
每个计数器都存储在字典counts 中,其中的键是字符串中的唯一字符。
from collections import Counter
counts = {}
s_lower = s.lower()
for char in set(s_lower):
counts[char] = Counter(
[c for i, c in enumerate(s_lower) if i > 0 and s_lower[i-1] == char]
)
对于您的字符串,它具有以下输出:
>>> print(counts['s'])
#Counter({'i': 1, 'e': 1, 'o': 1})
>>> print(counts['o'])
#Counter({' ': 2, 'd': 1, 'n': 1, 'u': 1})
需要注意的是,此方法将针对每个唯一字符遍历整个字符串,这可能会导致大型列表变慢。
这是一种使用collections.Counter 和collections.defaultdict 的替代方法,它只在字符串中循环一次:
from collections import defaultdict, Counter
def count_letters(s):
s_lower = s.lower()
counts = defaultdict(Counter)
for i in range(len(s_lower) - 1):
curr_char = s_lower[i]
next_char = s_lower[i+1]
counts[curr_char].update(next_char)
return counts
counts = count_letters(s)
我们循环遍历字符串中的每个字符(最后一个字符除外),并在每次迭代中使用下一个字符更新计数器。