python 如何计算一个单词按顺序重复了多少次

python How to count how many time a word repeats sequential

我在尝试执行此操作时偶然发现了很多计数器代码,但 none 完全正确。

给定一个重复术语的字符串,我想对每个术语进行分组,但我只想在按顺序重复时对它们进行分组。 对于这个字符串:

string="word, word, abc, stuff, word, stuff, stuff"

我想return一个'compressed'字符串

word(2), abc, stuff, word, stuff(2)

请注意,需要保留顺序,因此我无法按每个单词分组。如果使用 regrex 或 string.split(',') 可以工作,则字符串的每个单词将由 ,\s 分隔。

关于如何让计数器只计算重复的连续单词的任何想法,以及如何存储此信息。我想过使用 dict 然后调用值(作为计数器)并添加 +1 但这不起作用,因为重复的键(即上面的字符串中有两个单词条目)。

import re
x="word, word, abc, stuff, word, stuff, stuff"
print [j+"("+str(i.count(j))+")" if i.count(j)>1 else j for i,j  in re.findall(r"((\w+)(?:,\s*)*)",x)]

您可以使用 re 执行此操作。

输出:['word(2)', 'abc', 'stuff', 'word', 'stuff(2)']

itertools.groupby 是处理此类任务的正确工具。通常,您需要拆分字符串,然后根据连续重复进行分组。最后,以您打算呈现的方式重新格式化数据是微不足道的

>>> groups = [(k, len(list(g))) 
              for k, g in itertools.groupby(map(str.strip,   string.split(',')))]
>>> ', '.join("{}{}".format(k, ['','({})'.format(g)][g > 1]) for k, g in groups)
'word(2), abc, stuff, word, stuff(2)'

你也可以不使用 itertools,只需将列表的最后一个处理元素存储在变量中并检查下一个元素是否匹配:

s = "word, word, abc, stuff, word, stuff, stuff"

words = []
last_word = None
for word in s.split(', '):
    if word != last_word:
        words.append([word, 1])
        last_word = word
    else:
        words[-1][1] += 1