14

这是我的解决方案导致错误。返回 0

PS:我仍然希望修复我的代码 :)

from collections import Counter
import string


def count_letters(word):
    global count
    wordsList = string.split(word)
    count = Counter()
    for words in wordsList:
        for letters in set(words):
            return count[letters]

word = "The grey old fox is an idiot"
print count_letters(word)
4

13 回答 13

22
def count_letters(word):
    return len(word) - word.count(' ')

或者,如果您有多个字母要忽略,您可以过滤字符串:

def count_letters(word):
    BAD_LETTERS = " "
    return len([letter for letter in word if letter not in BAD_LETTERS])
于 2013-08-27T00:46:21.563 回答
13

使用sum函数 的简单解决方案:

sum(c != ' ' for c in word)

这是一个内存高效的解决方案,因为它使用生成器而不是创建一个临时列表然后计算它的总和。

值得一提的是,c != ' 'returnsTrue or False是 type 的值bool,但是bool是 的子类型int,所以可以对 bool 值求和(True对应1False对应0

您可以使用以下方法检查继承mro

>>> bool.mro() # Method Resolution Order
[<type 'bool'>, <type 'int'>, <type 'object'>]

在这里,您会看到这bool是一个子类型,int它是 的子类型object

于 2013-08-27T01:01:53.177 回答
6

MattBryant 的回答很好,但是如果你想排除更多类型的字母而不仅仅是空格,它会变得笨拙。这是您当前代码的一个变体,可以使用Counter它:

from collections import Counter
import string

def count_letters(word, valid_letters=string.ascii_letters):
    count = Counter(word) # this counts all the letters, including invalid ones
    return sum(count[letter] for letter in valid_letters) # add up valid letters

示例输出:

>>> count_letters("The grey old fox is an idiot.") # the period will be ignored
22
于 2013-08-27T00:58:13.247 回答
4

使用正则表达式计算字符串中的字母数。

import re
s = 'The grey old fox is an idiot'
count = len(re.findall('[a-zA-Z]',s))
于 2016-06-06T15:05:31.200 回答
4

我设法将其浓缩为两行代码:

string = input("Enter your string\n")
print(len(string) - string.count(" "))
于 2015-09-19T15:59:18.983 回答
3

好的,如果这就是您想要的,这就是我要修复您现有代码的方法:

from collections import Counter

def count_letters(words):
    counter = Counter()
    for word in words.split():
        counter.update(word)
    return sum(counter.itervalues())

words = "The grey old fox is an idiot"
print count_letters(words)  # 22

如果您不想计算某些非空白字符,那么您需要删除它们——for如果不是更早,则在循环内。

于 2013-08-27T01:38:36.980 回答
3

对于另一种单线解决方案:

def count_letters(word):  return len(filter(lambda x: x not in " ", word))

这通过使用 filter 函数起作用,它允许您选择列表中的元素,这些元素在传递给您作为第一个参数传递的布尔值函数时返回 true。为此,我正在使用 lambda 函数来创建一个快速、一次性的函数。

>>> count_letters("This is a test")
11

您可以轻松扩展它以排除您喜欢的任何字符选择:

def count_letters(word, exclude):  return len(filter(lambda x: x not in exclude, word))

>>> count_letters ("This is a test", "aeiou ")
7

编辑:但是,您想让自己的代码工作,所以这里有一些想法。第一个问题是您没有设置要计数的 Counter 对象的列表。但是,由于您要查找字母的总数,因此您需要再次将单词重新组合在一起,而不是单独计算每个单词。循环累加每个字母的数量并不是真正必要的,因为您可以提取值列表并使用“sum”来添加它们。

这是一个尽可能接近您的代码的版本,没有循环:

from collections import Counter
import string

def count_letters(word):
   wordsList = string.split(word)
   count = Counter("".join(wordsList))
   return sum(dict(count).values())

word = "The grey old fox is an idiot"
print count_letters(word)

编辑:回应询问为什么不使用 for 循环的评论,这是因为它不是必需的,并且在许多情况下,使用许多隐式方式在 Python 中执行重复性任务可以更快、更易于阅读并且更节省内存.

例如,我可以写

joined_words = []
for curr_word in wordsList:
    joined_words.extend(curr_word)
count = Counter(joined_words)

但在这样做时,我最终分配了一个额外的数组并通过我的解决方案的 Python 解释器执行一个循环:

count = Counter("".join(wordsList))

将在一大块经过优化的编译 C 代码中执行。我的解决方案不是简化该循环的唯一方法,但它是一种方法。

于 2013-08-27T01:40:45.283 回答
3
n=str(input("Enter word: ").replace(" ",""))

ans=0
for i in n:
    ans=ans+1
print(ans)    
于 2017-10-22T11:03:11.190 回答
0

我发现这工作得很好

str = "count a character occurance"
str = str.replace(' ', '')
print (str)
print (len(str))
于 2016-04-01T01:49:20.760 回答
0
def count_letter(string):
    count = 0
    for i in range(len(string)):
        if string[i].isalpha():
            count += 1
    return count


print(count_letter('The grey old fox is an idiot.'))
于 2016-10-11T06:11:44.893 回答
0
word_display = ""
for letter in word:
    if letter in known:
        word_display = "%s%s " % (word_display, letter)
    else:
        word_display = "%s_ " % word_display
return word_display
于 2017-12-04T10:02:19.103 回答
0
string=str(input("Enter any sentence: "))
s=string.split()
a=0
b=0

for i in s:
    a=len(i)
    b=a+b

print(b)

它可以完美地工作而无需计算字符串的空格

于 2018-10-06T10:20:31.080 回答
-3

Try using...

resp = input("Hello, I am stuck in doors! What is the weather outside?")
print("You answered in", resp.ascii_letters, "letters!")

Didn't work for me but should work for some random guys.

于 2016-11-27T09:31:32.480 回答