2015-10-29 770 views
2

有很多计数器代码在那里,我试图做到这一点偶然发现,但没有正确的。python如何统计单词重复连续的次数

给定一个重复术语的字符串,我想将每个术语分组,但我只想将它们按顺序重复分组。 此字符串:

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

我想返回一个“压缩”串

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

注意,为了需要保留的,所以我不能按每个字。如果使用regrex或string.split(',')可以工作,字符串将使每个单词由,\s分开。

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

回答

4

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)' 
+0

是的,重新格式化将是一个简单的部分。我不太熟悉'itertools',但会仔细研究它。 – George

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*\2)*)",x)] 

您可以使用re来做到这一点。

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

+0

为什么downvoted ??? – vks

+0

你能解释一下'if i.count(j)> 1'的用法吗?如果我做你的循环,我得到相同的输出。 – George

+0

@George'i'是一个列表,'j'是在'i'中重复的一个元素。所以i.count在'i'中给出'j'的计数。 – vks

1

你可以不用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 
+0

这是我的第一个方法,但我看着i + 1,这并没有工作。我的代码也变得混乱,这是更好。 – George

相关问题