【问题标题】:Letter counting function字母计数功能
【发布时间】:2018-10-19 12:17:47
【问题描述】:

我需要定义一个函数,它接受一个字符串并计算输入中字母的数量(仅小写),例如,如果我输入“jack”,它将返回:

a=1,b=0,c=1,d=0,...,j=1,k=1,...,z=0.

所以我实现了以下内容:

def l_count(str):
    str.lower()
    for ch in str:
        return str.count('a')

仅返回字符串中'a'的数量。 因为我不想对所有字母都这样做,所以我考虑过实现这样的列表理解:

al = [chr(i) for i in range(ord('a'),ord('z'))] 
def l_count(str):
    str.lower()
    for character in str:
        return str.count(al)

但我得到一个错误:

must be str, not list 

我不知道如何更改它,因为我遇到了同样的错误。

【问题讨论】:

  • 那是因为al是一个列表
  • 报错信息很清楚了吧?
  • 我知道,但我该如何改变它
  • 虽然很诱人,但不要调用你的字符串str - 这是一个内置函数。
  • 请阅读How to ask

标签: python list-comprehension counter alphabetical alphabetical-sort


【解决方案1】:

这是使用collections.Counter的一种方式:

from collections import Counter
from string import ascii_lowercase

x = 'jack'

c = Counter(dict.fromkeys(ascii_lowercase, 0))
c.update(Counter(x))

print(*(f'{k}={v}' for k, v in c.items()), sep=',')

a=1,b=0,c=1,d=0,e=0,f=0,g=0,h=0,i=0,j=1,k=1,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0

您可能希望在lowercase 您的字符串中添加逻辑,排除标点符号等。

【讨论】:

    【解决方案2】:

    您可以为此使用Counter 对象

    from collections import Counter
    Counter(x for x in string.lower() if x.isalpha())
    

    这会将string 中的所有字符转换为小写,检查它们是否是字母,然后对所有字符进行计数。

    【讨论】:

    • 这不包括所有那些...=0 OP 似乎想要拥有的计数。
    • 是的,但是如果您使用counter.get('<character>', 0) 来检索计数,当字符不存在时它将返回 0。
    • 这也是真的。事实上,你甚至不必get,你也可以对不在字符串中的任何x 执行counter[x],并得到0
    【解决方案3】:

    我认为你需要这个:

    import string
    def l_count(stra):
        stra = stra.lower()
        return {i:stra.count(i) for i in string.ascii_lowercase}
    

    【讨论】:

    • 方法str.lower有一个返回值。它不会在内部修改实例。在您的情况下,它应该是stra = stra.lower()
    【解决方案4】:

    如果您只想要字符串中存在的字符,那么您可以使用Counter 对象:

    >>> from collections import Counter
    >>> my_counter = Counter('jack')
    >>> my_counter
    Counter({'j': 1, 'a': 1, 'c': 1, 'k': 1})
    

    如果你想显示所有小写字母的计数,你现在可以像这样循环:

    >>> import string
    >>> ','.join('{}={}'.format(ch, my_counter.get(ch, 0)) for ch in string.ascii_lowercase)
    'a=1,b=0,c=1,d=0,e=0,f=0,g=0,h=0,i=0,j=1,k=1,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0'
    
    >>> for ch in string.ascii_lowercase:
    ...     print(ch, my_counter.get(ch, 0))
    a 1
    b 0
    c 1
    d 0
    e 0
    f 0
    g 0
    h 0
    i 0
    j 1
    k 1
    l 0
    m 0
    n 0
    o 0
    p 0
    q 0
    r 0
    s 0
    t 0
    u 0
    v 0
    w 0
    x 0
    y 0
    z 0
    

    【讨论】:

      猜你喜欢
      • 2023-01-16
      • 1970-01-01
      • 2015-05-12
      • 2015-07-16
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      相关资源
      最近更新 更多