我有许多反击代码在试图做到这一点时偶然发现,但没有一个正确。
给定一个重复术语的字符串,我想对每个术语进行分组,但我只想按顺序重复它们。 对于这个字符串:
string="word, word, abc, stuff, word, stuff, stuff"
我想退回一个'压缩'串
word(2), abc, stuff, word, stuff(2)
请注意,订单需要保留,因此我无法按每个单词进行分组。如果使用regrex或,\s
可以使用,则字符串将每个单词用string.split(',')
分隔。
有关如何让计数器只计算重复的连续单词,以及如何存储此信息的任何想法。我想到使用dict然后调用值(作为计数器)并添加+1但是在重复键时没有工作(即上面的字符串中有两个单词条目)。
答案 0 :(得分: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)'
答案 1 :(得分: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)']
答案 2 :(得分: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