Python 字符串上的字母计数

Python 字符串上的字母计数,python,Python,这里是Python新手。我试图数一数给定字符串中字母“a”的数量。代码如下。它在字符串“banana”中不断返回1而不是3。欢迎您的任何意见 def count_letters(word, char): count = 0 while count <= len(word): for char in word: if char == word[count]: count += 1

这里是Python新手。我试图数一数给定字符串中字母“a”的数量。代码如下。它在字符串“banana”中不断返回1而不是3。欢迎您的任何意见

def count_letters(word, char):
    count = 0
    while count <= len(word):
        for char in word:
            if char == word[count]:
                count += 1
            return count



print count_letters('banana','a')
def count_字母(单词、字符):
计数=0

当count时,您的
返回在for循环中!注意缩进,您希望行
返回计数
在循环之外。由于for循环遍历
word
中的所有字符,因此完全不需要外部while循环

已清理版本:

def count_letters(word, to_find):
    count = 0
    for char in word:
        if char == to_find:
            count += 1
    return count

一个问题是,您正在使用
count
引用您正在检查的单词中的位置和您看到的
char
的数量,并且您正在使用
char
引用您正在检查的输入字符和字符串中的当前字符。使用单独的变量代替

另外,将
return
语句移出循环;否则,您将始终在检查第一个字符后返回

最后,您只需要一个循环来迭代字符串。去掉外部
while
循环,就不需要跟踪字符串中的位置

根据这些建议,您的代码如下所示:

def count_letters(word, char):
  count = 0
  for c in word:
    if char == c:
      count += 1
  return count

我觉得有几件事不对

  • 重复使用标识符
    char
    ,这样会导致问题
  • 你说的是
    if char==word[count]
    而不是
    word[some index]
  • 在for循环的第一次迭代之后返回 您甚至不需要
    。如果将char参数重命名为
    search

    for char in word:
        if char == search:
            count += 1
    return count
    

    其他答案显示了代码的错误。但如果你不只是为了锻炼,还有一种内置的方法:

    >>> 'banana'.count('a')
    3
    

    Danben给出了更正后的版本:

    def count_letters(word, char):
      count = 0
      for c in word:
        if char == c:
          count += 1
      return count
    
    这里有一些其他的方法,希望他们能教你更多关于Python的知识

    类似,但循环的
    较短。利用布尔值可以在为真时变为1,在为假时变为0的事实:

    def count_letters(word, char):
      count = 0
      for c in word:
        count += (char == c)
      return count
    
    循环的缩写通常可以转换为列表/生成器理解。这将创建一个与每个字母对应的整数列表,如果字母与字符不匹配,则为0;如果字母与字符不匹配,则为1,然后对它们求和:

    def count_letters(word, char):
      return sum(char == c for c in word)
    
    下一个选项过滤掉所有与字符不匹配的字符,并计算剩余的字符数:

    def count_letters(word, char):
      return len([c for c in word if c == char])
    

    或者,您可以使用:

    mystring = 'banana'
    number = mystring.count('a')
    

    您有许多问题:

    • 正如其他人已经指出的那样,您的缩进存在问题
    • 不需要嵌套循环。只要一个循环就足够了
    • 您使用char表示两种不同的含义,但是for循环中的char变量将覆盖参数中的数据
    此代码修复了所有这些错误:

    def count_letters(word, char):
        count = 0
        for c in word:
            if char == c:
                count += 1
        return count
    
    编写此代码的一种更简洁的方法是使用生成器表达式:

    def count_letters(word, char):
        return sum(char == c for c in word)
    
    或者只需使用内置方法即可:

    print 'abcbac'.count('c')
    
    三,


    一个简单的方法如下:

    def count_letters(word, char):
        return word.count(char)
    
    或者,还有另一种直接计算每个元素的方法:

    from collections import Counter
    Counter('banana')
    
    当然,您可以指定一个元素,例如

    Counter('banana')['a']
    
    “banana.count(“ana”)
    返回1而不是2

    我认为该方法在字符串(或列表)上迭代的步长等于子字符串的长度,因此它不会看到此类内容

    因此,如果您想要“完整计数”,您必须使用步骤1的正确循环实现自己的计数器


    如果我错了,请纠正我…

    以下程序将字符串作为输入并输出一个数据帧,它表示字母计数


    样本输入
    你好
    样本输出
     烧焦 频率
    0 H  1
    1. E  1
    2. L  2
    3. o  一,

    import pandas as pd
    
    def count_letters(word, char):
        return word.count(char)
    
    text = input()
    text_split = text.split()
    list1 = []
    list2 = []
    for i in text_split:
        for j in i:
            counter = count_letters (text, j)
            list1.append(j)
            list2.append(counter)
    dictn = dict(zip(list1, list2))
    df = pd.DataFrame (dictn.items(), columns = ['char', 'freq.'])
    print (df)
    

    谢谢,但我正试着了解这个概念。你不需要在Python中使用布尔值:
    True==1和False==0
    @J.F.塞巴斯蒂安:非常有趣!我从来不知道。编辑以反映另一个变量
    sum(如果x==值,则iterable中的x为1)
    。如果iterable没有
    count()
    方法,它可能会很有用。我注意到'banana'.count('ana')返回1,而不是您可能期望的2。我认为您的代码缩进正确。你会得到一个缩进错误。
    from collections import Counter
    Counter('banana')
    
    Counter('banana')['a']
    
    import pandas as pd
    
    def count_letters(word, char):
        return word.count(char)
    
    text = input()
    text_split = text.split()
    list1 = []
    list2 = []
    for i in text_split:
        for j in i:
            counter = count_letters (text, j)
            list1.append(j)
            list2.append(counter)
    dictn = dict(zip(list1, list2))
    df = pd.DataFrame (dictn.items(), columns = ['char', 'freq.'])
    print (df)