【问题标题】:计算字符串中某个字符出现的次数
【发布时间】:2010-11-12 10:34:15
【问题描述】:

计算字符串中字符出现次数的最简单方法是什么?

例如计算'a''Mary had a little lamb' 中出现的次数。

【问题讨论】:

  • 若要根据下面的最佳答案交叉检查结果,您也可以use this tool
  • 您可能会找到最简单的编码方式,但最终,无论我们使用循环还是内置 count(),时间复杂度都保持不变。

标签: python string count


【解决方案1】:

要查找句子中出现的字符,您可以使用以下代码

首先,我从句子中取出唯一字符,然后计算句子中每个字符的出现次数,其中也包括空格的出现。

ab = set("Mary had a little lamb")

test_str = "Mary had a little lamb"

for i in ab:
  counter = test_str.count(i)
  if i == ' ':
    i = 'Space'
  print(counter, i)

以上代码的输出如下。

1 : r ,
1 : h ,
1 : e ,
1 : M ,
4 : a ,
1 : b ,
1 : d ,
2 : t ,
3 : l ,
1 : i ,
4 : Space ,
1 : y ,
1 : m ,

【讨论】:

  • 投反对票。 stackoverflow.com/a/49385352/11154841 的重复,它只会使不需要的方式超过 ''.join()
  • @-questionto42 请您详细说明您在此处陈述的重复含义,但我同意您关于使用 join 的观点,我将删除它。谢谢!
  • 另一个答案是第一个,其中还有一个字符串的set(),它会循环检查集合中每个字母的count()。它将结果添加到字典的键中,然后打印字典,而不是在循环期间直接打印计数的答案(无论如何打印结果并不是主要思想)。因此重复。
  • @questionto42 这个概念可以被任何人使用,同样的想法可能会出现在不同的脑海中,但是当你说答案是重复的时,我说这不是我经历过你提到的那个 stackoverflow评论和那个答案有区别,我的没有计算空格字符,在我的答案中计算了它,所以它不是重复的,因为重复意味着每个和一切都应该完全相同。请对此进行说明,如果您认为此解释正确,则可以删除您的反对票。
  • 我看过了。另一种解决方案为您提供了一个字典,其中' ' 作为键,' ' 的数量作为值。您可以根据需要使用pop 重命名字典的键,在这种情况下将' ' 重命名为space,这不会增加价值。我仍然撤回我的反对票,因为有人可能想要一个没有字典的解决方案。然而,这是重复的,主要技巧只是 set()count(),你重复。
【解决方案2】:
str = "count a character occurence"

List = list(str)
print (List)
Uniq = set(List)
print (Uniq)

for key in Uniq:
    print (key, str.count(key))

【讨论】:

【解决方案3】:

接受this user的评论:

import numpy as np
sample = 'samplestring'
np.unique(list(sample), return_counts=True)

输出:

(array(['a', 'e', 'g', 'i', 'l', 'm', 'n', 'p', 'r', 's', 't'], dtype='<U1'),
 array([1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1]))

检查's'。您可以按如下方式过滤这两个数组的元组:

a[1][a[0]=='s']

旁注:它的工作方式类似于collections 包中的Counter(),只是在 numpy 中,无论如何你经常会导入它。您也可以计算单词列表中的唯一单词。

【讨论】:

    【解决方案4】:
    a = 'have a nice day'
    symbol = 'abcdefghijklmnopqrstuvwxyz'
    for key in symbol:
        print(key, a.count(key))
    

    【讨论】:

      【解决方案5】:

      你可以使用循环和字典。

      def count_letter(text):
          result = {}
          for letter in text:
              if letter not in result:
                  result[letter] = 0
              result[letter] += 1
          return result
      

      【讨论】:

        【解决方案6】:

        最简单的方法是一行代码:

        'Mary had a little lamb'.count("a")
        

        但如果你想也可以使用它:

        sentence ='Mary had a little lamb'
           count=0;
            for letter in sentence :
                if letter=="a":
                    count+=1
            print (count)
        

        【讨论】:

        • 二十二个答案。最佳答案比我在 Stack Overflow 上八年来收到的总票数还要多。为什么你更喜欢这个解决方案?缺少现有答案的原因是什么?
        • 没有人提到python中的类方法。这是最简单和最短的方法
        • 现在,我看到他们提到了!没关系,我也只是想展示我的代码。我想没有人提到它
        【解决方案7】:

        这个简单直接的功能可能会有所帮助:

        def check_freq(x):
            freq = {}
            for c in set(x):
               freq[c] = x.count(c)
            return freq
        
        check_freq("abbabcbdbabdbdbabababcbcbab")
        {'a': 7, 'b': 14, 'c': 3, 'd': 3}
        

        如果需要理解:

        def check_freq(x):
            return {c: x.count(c) for c in set(x)}
        

        【讨论】:

          【解决方案8】:

          我知道要求是计算一个特定的字母。我这里写的是通用代码,没有使用任何方法。

          sentence1 =" Mary had a little lamb"
          count = {}
          for i in sentence1:
              if i in count:
                  count[i.lower()] = count[i.lower()] + 1
              else:
                  count[i.lower()] = 1
          print(count)
          

          输出

          {' ': 5, 'm': 2, 'a': 4, 'r': 1, 'y': 1, 'h': 1, 'd': 1, 'l': 3, 'i': 1, 't': 2, 'e': 1, 'b': 1}
          

          现在如果你想要任何特定的字母频率,你可以像下面这样打印。

          print(count['m'])
          2
          

          【讨论】:

            【解决方案9】:
            a = "I walked today,"
            c=['d','e','f']
            count=0
            for i in a:
                if str(i) in c:
                    count+=1
            
            print(count)
            

            【讨论】:

            • 这不区分 d、e、f 的计数。
            • 嗨@GinoMempin 不要认为这里的意图是区分但是您可以声明其他两个变量并将 i 与 'd'、'e' 和 'f' 分别进行比较,如果你愿意这样做.
            【解决方案10】:

            我不知道“最简单”,但简单的理解可以做到:

            >>> my_string = "Mary had a little lamb"
            >>> sum(char == 'a' for char in my_string)
            4
            

            利用内置求和、生成器理解以及 bool 是整数的子类这一事实:字符与 'a' 相等的概率有多大。

            【讨论】:

              【解决方案11】:

              我是 pandas 库的粉丝,尤其是 value_counts() 方法。您可以使用它来计算字符串中每个字符的出现次数:

              >>> import pandas as pd
              >>> phrase = "I love the pandas library and its `value_counts()` method"
              >>> pd.Series(list(phrase)).value_counts()
                   8
              a    5
              e    4
              t    4
              o    3
              n    3
              s    3
              d    3
              l    3
              u    2
              i    2
              r    2
              v    2
              `    2
              h    2
              p    1
              b    1
              I    1
              m    1
              (    1
              y    1
              _    1
              )    1
              c    1
              dtype: int64
              

              【讨论】:

              • v 很慢,但知道一个人已经是否有 pandas 中的数据
              【解决方案12】:

              Python-3.x:

              "aabc".count("a")
              

              str.count(sub[, start[, end]])

              返回 [start, end] 范围内子字符串 sub 的非重叠出现次数。可选参数 start 和 end 被解释为切片符号。

              【讨论】:

              • 接受的答案应该更新到这个
              【解决方案13】:

              Python 3

              有两种方法可以实现:

              1) 带有内置函数count()

              sentence = 'Mary had a little lamb'
              print(sentence.count('a'))`
              

              2) 不使用函数

              sentence = 'Mary had a little lamb'    
              count = 0
              
              for i in sentence:
                  if i == "a":
                      count = count + 1
              
              print(count)
              

              【讨论】:

                【解决方案14】:

                正如其他答案所说,使用字符串方法 count() 可能是最简单的,但如果您经常这样做,请查看collections.Counter

                from collections import Counter
                my_str = "Mary had a little lamb"
                counter = Counter(my_str)
                print counter['a']
                

                【讨论】:

                • 为什么经常使用会更好?有什么优势?
                • 如果你想计算给定字符串中很多字母的计数,Counter 会以更简洁的形式提供它们。如果你想从很多不同的字符串中计算一个字母,Counter 没有任何好处。
                • 对于这个特殊的例子,计算字符,我更喜欢collections.counter。为了查找特定子字符串的实例,我会使用正则表达式或 str.count() 方法。我还没有测试过,但是由于计算所有字符和附加到字典而不是计算单个子字符串的出现次数的开销很小,因此可能存在性能差异。我建议编写一个脚本来生成一个很长的文件来搜索,然后定时执行每个方法。
                • 频繁使用的好处是 Counter 计算所有计数 ONE TIME,这几乎和 mystring.count('a') 一次计算一样快。因此,如果您这样做 20 次,您可能会节省 10 倍的计算时间。 Counter 还可以告诉您某个项目是否在字符串中:例如,如果计数器中的 'a':
                【解决方案15】:

                在不使用 Counter()count 和正则表达式的情况下获取所有字符数的另一种方法

                counts_dict = {}
                for c in list(sentence):
                  if c not in counts_dict:
                    counts_dict[c] = 0
                  counts_dict[c] += 1
                
                for key, value in counts_dict.items():
                    print(key, value)
                

                【讨论】:

                  【解决方案16】:

                  str.count(a) 是计算字符串中单个字符的最佳解决方案。但是,如果您需要计算更多字符,则必须读取整个字符串的次数与要计算的字符数一样多。

                  这项工作的更好方法是:

                  from collections import defaultdict
                  
                  text = 'Mary had a little lamb'
                  chars = defaultdict(int)
                  
                  for char in text:
                      chars[char] += 1
                  

                  因此,您将拥有一个 dict,它返回字符串中每个字母的出现次数,如果不存在则返回 0

                  >>>chars['a']
                  4
                  >>>chars['x']
                  0
                  

                  对于不区分大小写的计数器,您可以通过子类化 defaultdict(基类是只读的)来覆盖 mutator 和 accessor 方法:

                  class CICounter(defaultdict):
                      def __getitem__(self, k):
                          return super().__getitem__(k.lower())
                  
                      def __setitem__(self, k, v):
                          super().__setitem__(k.lower(), v)
                  
                  
                  chars = CICounter(int)
                  
                  for char in text:
                      chars[char] += 1
                  
                  >>>chars['a']
                  4
                  >>>chars['M']
                  2
                  >>>chars['x']
                  0
                  

                  【讨论】:

                  • 你基本上是在重新实现Counter,它已经是collections中的一个类。
                  • @merv 不是。 Counter 是一个更臃肿的纯 Python 类,defaultdict__missing__written in C。对于像这样的简单任务(int 也在 C 中实现),这种方法稍微快一些。
                  • 另外,np.unique(sample, return_counts=True) 可能有用。
                  【解决方案17】:

                  “不使用count在字符串中查找你想要的字符”方法。

                  import re
                  
                  def count(s, ch):
                  
                     pass
                  
                  def main():
                  
                     s = raw_input ("Enter strings what you like, for example, 'welcome': ")  
                  
                     ch = raw_input ("Enter you want count characters, but best result to find one character: " )
                  
                     print ( len (re.findall ( ch, s ) ) )
                  
                  main()
                  

                  【讨论】:

                  • 为什么是空计数功能?为什么是 main() 函数?为什么到处都是丑陋的空间?这不是一个好的答案。
                  【解决方案18】:

                  count 绝对是计算字符串中字符出现次数的最简洁有效的方法,但我尝试使用 lambda 提出解决方案>,类似这样:

                  sentence = 'Mary had a little lamb'
                  sum(map(lambda x : 1 if 'a' in x else 0, sentence))
                  

                  这将导致:

                  4
                  

                  此外,这样做还有一个好处是,如果句子是包含与上述相同字符的子字符串列表,那么由于使用了in,这也给出了正确的结果。看看:

                  sentence = ['M', 'ar', 'y', 'had', 'a', 'little', 'l', 'am', 'b']
                  sum(map(lambda x : 1 if 'a' in x else 0, sentence))
                  

                  这也会导致:

                  4
                  

                  但当然,这仅在这种特殊情况下检查单个字符(例如 'a')的出现时才有效。

                  【讨论】:

                    【解决方案19】:

                    str.count(sub[, start[, end]])

                    返回[start, end] 范围内子字符串sub 的非重叠出现次数。可选参数 startend 被解释为切片符号。

                    >>> sentence = 'Mary had a little lamb'
                    >>> sentence.count('a')
                    4
                    

                    【讨论】:

                      【解决方案20】:

                      你可以使用count()

                      >>> 'Mary had a little lamb'.count('a')
                      4
                      

                      【讨论】:

                        【解决方案21】:

                        恕我直言,您可以添加上限或下限方法

                        def count_letter_in_str(string,letter):
                            return string.count(letter)
                        

                        【讨论】:

                          【解决方案22】:
                          spam = 'have a nice day'
                          var = 'd'
                          
                          
                          def count(spam, var):
                              found = 0
                              for key in spam:
                                  if key == var:
                                      found += 1
                              return found
                          count(spam, var)
                          print 'count %s is: %s ' %(var, count(spam, var))
                          

                          【讨论】:

                            【解决方案23】:

                            如果您想要不区分大小写(当然还有正则表达式的所有功能),正则表达式非常有用。

                            my_string = "Mary had a little lamb"
                            # simplest solution, using count, is case-sensitive
                            my_string.count("m")   # yields 1
                            import re
                            # case-sensitive with regex
                            len(re.findall("m", my_string))
                            # three ways to get case insensitivity - all yield 2
                            len(re.findall("(?i)m", my_string))
                            len(re.findall("m|M", my_string))
                            len(re.findall(re.compile("m",re.IGNORECASE), my_string))
                            

                            请注意,正则表达式版本的运行时间大约是其十倍,只有当 my_string 非常长或代码位于深度循环中时,这才可能成为问题。

                            【讨论】:

                            • 如果您只是想解决区分大小写的问题,那么正则表达式就太过分了。 my_sting.lower().count('m') 更高效、更清晰、更简洁。
                            【解决方案24】:
                            myString.count('a');
                            

                            更多信息here

                            【讨论】:

                              【解决方案25】:

                              可能是正则表达式?

                              import re
                              my_string = "Mary had a little lamb"
                              len(re.findall("a", my_string))
                              

                              【讨论】:

                              • 一个好主意,但在这种情况下有点矫枉过正。字符串方法 'count' 做了同样的事情,另外还有一个好处是可以立即知道它在做什么。
                              • 为什么是负利率,也许有人需要这种代码来做类似的事情。我的投票
                              • 这应该被否决,因为它是对字符串中的字符进行计数的效率最低的方法。如果目标只是简单地计算字符,如问题所示,那么很难找到更糟糕的方法来完成这项工作。在内存和处理器开销方面,这个解决方案肯定是要避免的。没有人会“需要”使用这种方法来查找字符串中的字符数。
                              • 字符串方法不可用时的好解决方案:len(re.findall('1',bin(10)))
                              • @Conor 什么时候字符串方法不可用?为什么不只是bin(10).count('1')
                              猜你喜欢
                              • 2017-10-09
                              • 2013-12-25
                              • 1970-01-01
                              • 2013-02-24
                              • 1970-01-01
                              • 1970-01-01
                              • 2014-04-24
                              相关资源
                              最近更新 更多