【问题标题】:python How to count how many time a word repeats sequentialpython如何计算一个单词顺序重复的次数
【发布时间】:2015-10-29 07:30:42
【问题描述】:

我在尝试这样做时偶然发现了许多计数器代码,但没有一个完全正确。

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

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

我想返回一个“压缩”字符串

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

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

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

【问题讨论】:

    标签: python string counter


    【解决方案1】:

    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 不太熟悉,但会看看。
    【解决方案2】:
    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)']

    【讨论】:

    • 你能解释一下if i.count(j)>1的用法吗?如果我执行你的 for 循环,我会得到相同的输出。
    • @George i 是一个列表,j 是在 i 中重复的一个元素。所以 i.count 计算了 ij 的计数
    【解决方案3】:

    您也可以不使用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
    

    【讨论】:

    • 那是我的第一种方法,但我查看了 i+1 并不太奏效。我的代码也变得乱七八糟,这好多了。
    猜你喜欢
    • 2017-10-22
    • 2019-06-01
    • 1970-01-01
    • 2017-01-31
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多