【问题标题】:Python - Counting Letter Frequency in a StringPython - 计算字符串中的字母频率
【发布时间】:2021-12-31 11:53:04
【问题描述】:

我想写下每个字符串的字母频率。我的输入和预期输出是这样的。

"aaaa" -> "a4"
"abb" -> "a1b2"
"abbb cc a" -> "a1b3 c2 a1"
"bbbaaacddddee" -> "b3a3c1d4e2"
"a   b" -> "a1 b1"

我找到了this solution,但它以随机顺序给出了频率。我该怎么做?

【问题讨论】:

  • 你做了什么?请向我们展示您的代码。
  • 你排序对吗?
  • @Ruthvik 我可以使用 .sort() 我知道,但是第 4 个例子有风险
  • @asnerdyasSteveWozniak 我已经编写了我找到的代码的源代码,但我没有按预期进行

标签: python string frequency


【解决方案1】:

这是否满足您的需求?

from itertools import groupby
s = "bbbaaac ddddee aa"

groups = groupby(s)
result = [(label, sum(1 for _ in group)) for label, group in groups]
res1 = "".join("{}{}".format(label, count) for label, count in result)
# 'b3a3c1 1d4e2 1a2'

# spaces just as spaces, do not include their count
import re
re.sub(' [0-9]+', ' ', res1)
'b3a3c1 d4e2 a2'

【讨论】:

    【解决方案2】:

    对我来说,乍一看有点棘手。例如,看起来"bbbaaacddddee" -> "b3a3c1d4e2"确实需要按传入字符串中出现的顺序输出计数结果:

    import re
    
    def unique_elements(t):
        l = []
        for w in t:
            if w not in l:
                l.append(w)
        return l
    
    def splitter(s):
        res = []
        tokens = re.split("[ ]+", s)
        for token in tokens:
            s1 = unique_elements(token) # or s1 = sorted(set(token))
            this_count = "".join([k + str(v) for k, v in list(zip(s1, [token.count(x) for x in s1]))])
            res.append(this_count)
        return " ".join(res)
    
    print(splitter("aaaa"))
    print(splitter("abb")) 
    print(splitter("abbb cc a"))
    print(splitter("bbbaaacddddee")) 
    print(splitter("a   b")) 
    

    输出

    a4
    a1b2
    a1b3 c2 a1
    b3a3c1d4e2
    a1 b1
    

    如果出现的顺序不是真正的交易,您可以忽略unique_elements 函数,只需在splitter 中替换s1 = sorted(set(token)) 之类的东西,如评论中所示。

    【讨论】:

      【解决方案3】:
      here is you answer
      
      test_str = "here is your answer"
      res = {}
      list=[]
      list=test_str.split()
      # print(list)
      for a in list:
          res={}
          for keys in a:
              res[keys] = res.get(keys, 0) + 1
          for key,value in res.items():
              print(f"{key}{value}",end="")
          print(end=" ")
      

      【讨论】:

        【解决方案4】:

        无需重复每个单词中的每个字符。
        这是一个替代解决方案。 (如果你不想使用 itertools,那看起来很整洁。)

        def word_stats(data: str=""):
            all = []
            for word in data.split(" "):
                res = []
                while len(word)>0:
                    res.append(word[:1] + str(word.count(word[:1])))
                    word = word.replace(word[:1],"")
                res.sort()
                all.append("".join(res))
            return " ".join(all)
        
        print(word_stats("asjssjbjbbhsiaiic ifiaficjxzjooro qoprlllkskrmsnm mmvvllvlxjxj jfnnfcncnnccnncsllsdfi"))
        print(word_stats("abbb cc a"))
        print(word_stats("bbbaaacddddee"))
        

        这将输出:

        c5d1f3i1j1l2n7s2  
        a1b3 c2 a1  
        a3b3c1d4e2
        

        【讨论】:

          猜你喜欢
          • 2023-03-25
          • 2017-04-20
          • 2019-06-04
          • 2018-09-08
          • 2012-06-04
          • 2016-05-18
          • 2016-07-25
          相关资源
          最近更新 更多