Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 返回字母表中每个字母在字符串中出现的次数_Python_String_Python 3.x_Iteration - Fatal编程技术网

Python 返回字母表中每个字母在字符串中出现的次数

Python 返回字母表中每个字母在字符串中出现的次数,python,string,python-3.x,iteration,Python,String,Python 3.x,Iteration,我编写了一个函数来计算给定字符串中单个字母的出现次数: def count_letters(string, letter): '''returns the number of letters letter in a sentence string.''' count = 0 for char in string: if char == letter: count += 1 return count 现在,我想找到一种方法,以列表格式返回所有字母出现的次数(假设它们都是

我编写了一个函数来计算给定字符串中单个字母的出现次数:

def count_letters(string, letter):
'''returns the number of letters letter in a sentence string.'''

count = 0
for char in string:
    if char == letter:
        count += 1
return count
现在,我想找到一种方法,以列表格式返回所有字母出现的次数(假设它们都是小写-我使用的是
string.lower()
)。我将字母计数器初始化为26个0的列表:

letter_counter = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
但我不知道如何遍历给定的字符串并为每个字母追加列表

例如,如果
string=“Hello”
字母计数器返回:

letter_counter = [0,0,0,0,1,0,0,1,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0]
我以为这只是for循环中的for循环的问题,但它似乎更复杂。也许我只是看了太久


提前感谢。

为什么要重新发明轮子


你可以使用collections.Counter(string)
,它将返回一个字典,其中字符串中的所有字母作为键,频率作为键的值。

为什么要重新发明轮子


您只需使用集合。计数器(字符串),它将返回一个字典,其中字符串中的所有字母作为键,频率作为所述键的值。

更好的方法是按照Alessandro Power和Pythonista的建议使用集合。如果你不想使用那个黑匣子,那么这就是你可以做的

    # Replace this with your string
    string = 'AbcdEfghiJ'
    # create dictionary to locate a position of each letter
    str_dict = {'a':0, 'b':1, 'c':2, 'd':3, 'e':4, 'f':5, 'g':6, 'h':7,
        'i':8, 'j':9, 'k':10, 'l':11, 'm':12, 'n':13, 'o':14,
        'p':15, 'q':16, 'r':17, 's':18, 't':19, 'u':20, 'v':21,
        'w':22, 'x':23, 'y':24, 'z':25}
    letter_counter = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    # locate a position of char in letter_counter and add 1.
    for char in string:
        str_lower = char.lower()
        letter_counter[str_dict[str_lower]] += 1

    print letter_counter

Out[1]:[1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0]

更好的方法是按照亚历山德罗·鲍尔和毕托尼斯塔的建议使用集合。如果你不想使用那个黑匣子,那么这就是你可以做的

    # Replace this with your string
    string = 'AbcdEfghiJ'
    # create dictionary to locate a position of each letter
    str_dict = {'a':0, 'b':1, 'c':2, 'd':3, 'e':4, 'f':5, 'g':6, 'h':7,
        'i':8, 'j':9, 'k':10, 'l':11, 'm':12, 'n':13, 'o':14,
        'p':15, 'q':16, 'r':17, 's':18, 't':19, 'u':20, 'v':21,
        'w':22, 'x':23, 'y':24, 'z':25}
    letter_counter = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    # locate a position of char in letter_counter and add 1.
    for char in string:
        str_lower = char.lower()
        letter_counter[str_dict[str_lower]] += 1

    print letter_counter

Out[1]:[1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0]

通过使用并减去97('a'=97,'b'=98等)将小写字符转换为unicode索引,可以将其直接转换为基于0的索引:


您绝对应该避免在字符串中循环26次来逐个计算每个字母

通过使用并减去97('a'=97,'b'=98等)将小写字符转换为unicode索引,可以将小写字符直接转换为基于0的索引:


您绝对应该避免在字符串中循环26次来逐个计算每个字母

要计数字母,您有许多选项,按优先顺序排列:

  • collections.Counter
    如果您想快速完成此操作
  • 使用字典(这是
    计数器所做的)
  • 使用(零)填充列表-您的方法
  • collection.Counter方法非常简单:

    >>> from collections import Counter
    >>> Counter('hello').most_common()
    [('l', 2), ('h', 1), ('e', 1), ('o', 1)]
    
    字典方法需要更多的工作。有两种方法可以做到这一点。第一种方法是使用字典中的
    setdefault
    方法,以确保第一次看到字母时,它已使用默认值正确初始化

    >>> d = {}
    >>> for letter in 'hello':
    ...    d[letter] = d.setdefault(letter, 0) + 1
    ...
    >>> d
    {'h': 1, 'e': 1, 'l': 2, 'o': 1}
    
    第二种方法使用了与上述相同的概念,但使用了
    defaultdict

    >>> from collections import defaultdict
    >>> d = defaultdict(int)
    >>> for letter in 'hello':
    ...    d[letter] += 1
    ...
    >>> d
    defaultdict(<type 'int'>, {'h': 1, 'e': 1, 'l': 2, 'o': 1})
    
    这种方法存在一些问题;最大的一个问题是,它只适用于某些单词,而不适用于诸如
    hello world
    之类的短语,也不适用于连接词或标点符号:
    我们赢了


    您可以随时围绕这些进行编程,但其他方法没有这些问题。

    要计算字母数,您有许多选项,按优先顺序排列:

  • collections.Counter
    如果您想快速完成此操作
  • 使用字典(这是
    计数器所做的)
  • 使用(零)填充列表-您的方法
  • collection.Counter方法非常简单:

    >>> from collections import Counter
    >>> Counter('hello').most_common()
    [('l', 2), ('h', 1), ('e', 1), ('o', 1)]
    
    字典方法需要更多的工作。有两种方法可以做到这一点。第一种方法是使用字典中的
    setdefault
    方法,以确保第一次看到字母时,它已使用默认值正确初始化

    >>> d = {}
    >>> for letter in 'hello':
    ...    d[letter] = d.setdefault(letter, 0) + 1
    ...
    >>> d
    {'h': 1, 'e': 1, 'l': 2, 'o': 1}
    
    第二种方法使用了与上述相同的概念,但使用了
    defaultdict

    >>> from collections import defaultdict
    >>> d = defaultdict(int)
    >>> for letter in 'hello':
    ...    d[letter] += 1
    ...
    >>> d
    defaultdict(<type 'int'>, {'h': 1, 'e': 1, 'l': 2, 'o': 1})
    
    这种方法存在一些问题;最大的一个问题是,它只适用于某些单词,而不适用于诸如
    hello world
    之类的短语,也不适用于连接词或标点符号:
    我们赢了

    您可以随时围绕这些问题进行编程,但其他方法没有这些问题。

    • 这是一个简单的方法来计算一个字符中每个字符的频率 使用java编程的字符串
    • 注意:它按字母顺序给出输出,而不是按字母顺序 发生
    • 例如:输入:“你好”输出:e=1H=1L=2O=1

      class char_frequency
          { public static void main (String s)
      { s=s.toLowerCase();
          for (char i= 'a'; i<='z'; i++)
          {check (s,i);}
      }
      
      public static void check (String s, char ch)
      { int l= s.length(); char a='a'; int c=0;
          for (int i= 0; i<=l-1; i++)
          { a= s.charAt (i);
              if (ch== a)
                  c++;
      
          }
               if (c>0)
               System.out.println ( ch+ "= " + c);
      }
      
      class字符频率
      {公共静态void main(字符串s)
      {s=s.toLowerCase();
      对于(字符i='a';i
      • 这是一个简单的方法来计算一个字符中每个字符的频率 使用java编程的字符串
      • 注意:它按字母顺序给出输出,而不是按字母顺序 发生
      • 例如:输入:“你好”输出:e=1H=1L=2O=1

        class char_frequency
            { public static void main (String s)
        { s=s.toLowerCase();
            for (char i= 'a'; i<='z'; i++)
            {check (s,i);}
        }
        
        public static void check (String s, char ch)
        { int l= s.length(); char a='a'; int c=0;
            for (int i= 0; i<=l-1; i++)
            { a= s.charAt (i);
                if (ch== a)
                    c++;
        
            }
                 if (c>0)
                 System.out.println ( ch+ "= " + c);
        }
        
        class字符频率
        {公共静态void main(字符串s)
        {s=s.toLowerCase();
        
        for(char i='a';i使用
        collections.Counter
        是计算序列中出现次数的最常用方法。您还可以在
        字母\u Counter
        上执行for循环,确保将每个索引转换为具有
        chr(ord('a'+i))的字符
        。使用
        集合。计数器
        是计算序列中出现次数的最常用方法。您还可以在
        字母计数器上执行for循环,确保使用
        chr(ord('a'+i))
        将每个索引转换为char。啊,很公平,我主要是想看看是否可以使用for循环:)啊,很公平,我主要只是想看看是否可以用for循环来完成:)非常感谢!你知道我如何用句子来完成这项工作吗?当我尝试用空格来完成一个句子时(例如“你好,再见”),它会返回关键错误:“我试图使用.strip()和.replace(),但这不起作用。@maio123maio:你应该添加“如果char!=”:“使其成为sur