python—计算字符串列表中出现的双字符和三字符数

zf9nrax1  于 2021-08-25  发布在  Java
关注(0)|答案(2)|浏览(372)

我有一个很长的字符串列表(以下只是117k列表的一个示例):

names = ['abc', 'aabc', 'aaabc', 'abbc', 'abxcc']

是否有一种有效的方法来计算有多少个双字符(例如 aa )或三个字符(例如 aaa )出现在里面吗?我能想到的唯一方法是进行如下循环:

for letter in alphabet:
  for word in strings_list:
    for letter in word
      etc.

但由于我的名单很大,我想知道是否有更有效的方法。
我还应该提到,我的名单是中文的,因此我有大约6600个独特的字符
预期产出:

number_of_doubles = value_1
number_of_triples = value_2

更新:
为了澄清,字符串 aaa 应该算三倍而不是两倍

sf6xfgos

sf6xfgos1#

您可以编写一个进行累积计数的自定义函数,并使用它来获得连续的双精度、三精度等:

def cumcount(word):
    counter = [1]
    for i, c in enumerate(word):
        if i == 0:
            continue
        if c == word[i-1]:
            counter[-1] += 1
        else:
            counter += [1]
    return counter

# for doubles

>>> {name: cumcount(name).count(2) for name in names}
{'abc': 0, 'aabc': 1, 'aaabc': 0, 'abbc': 1, 'abxcc': 1}

# for triples

>>> {name: cumcount(name).count(3) for name in names}
{'abc': 0, 'aabc': 0, 'aaabc': 1, 'abbc': 0, 'abxcc': 0}
mrwjdhj3

mrwjdhj32#

正则表达式 ([a-z])\1\1 将匹配任意字母a-z和的三次重复 ([a-z])\1 将匹配两次重复。

>>> re3 = re.compile(r"([a-z])\1\1")
>>> re2 = re.compile(r"([a-z])\1")
>>> names = ['abc', 'aabc', 'aaabc', 'abbc', 'abxcc']
>>> for n in names:
        print(n, len(re2.findall(n)), len(re3.findall(n)))

abc 0 0
aabc 1 0
aaabc 1 1
abbc 1 0
abxcc 1 0

你的问题不清楚是否 aaa 算作两场比赛。如果没有,你可能需要做一些补充检查。在正则表达式中这样做可能会有不必要的困难,因此您可能希望以其他方式消除重复计数。

相关问题