对于另一种单线解决方案:
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 代码中执行。我的解决方案不是简化该循环的唯一方法,但它是一种方法。