在python中使用函数sum()和列表推导

时间:2018-03-27 02:47:47

标签: python list function sum list-comprehension

我有一个问题需要列表理解,必须使用 sum()函数,它可能不是最好的方法,但这就是问题。请阅读以下问题:

问题: 编写一个使用列表推导的函数word_count(string,word)和sum()函数来计算一个单词出现在字符串中的次数。将此应用于狄更斯弦。提示:sum()函数可用于添加列表的元素。例如, 总和([1,2,3]) 将返回6.某些单词是否有问题?哪些是为什么?尝试使用条带字符串方法(我们稍后在讨论正则表达式时再次访问它)。

使用的字符串:

dickens = """
It was the best of times, it was the worst of times, 
it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, 
it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, 
it was the spring of hope, it was the winter of despair, we had everything before us, we had 
nothing before us, we were all going direct to Heaven, we were all going direct the other way -
in short, the period was so far like the present period, that some of its noisiest authorities 
insisted on its being received, for good or for evil, in the superlative degree of comparison only.
"""

def word_count(s, w):
   return [word for word in s.strip().split() if w == word ]
print(word_count(dickens, "it"))

output= ['it', 'it', 'it', 'it', 'it', 'it', 'it', 'it', 'it']

所以基本上从这里开始,使用sum函数,我怎样才能得到将所有元素求和为9的答案。

def word_count(s, w):
   return sum([word for word in s.strip().split() if w == word ])

print(word_count(dickens, "it"))

这对我不起作用,但必须看起来像这样。

由于

4 个答案:

答案 0 :(得分:5)

如果您必须使用sum()进行计数,请尝试将该单词的每个匹配项都视为1.尽管这是一个次优的解决方案,但它可能正好符合给定的要求。

sum([1 for word in s.strip().split() if w == word ])
     ^

相当于:

sum([1, 1, 1, 1, ......])

还有其他形式(基本上相同)的解决方案:

sum(w == word for word in s.strip().split())

它被解释为

sum( (w == word) for word in s.strip().split() )

和布尔值在添加时被视为1和0,因此您可以获得匹配单词的数量。

后一种方法比第一种方法更快,因为它创建了一个生成器对象,而不是一个充满1的实际列表。

答案 1 :(得分:4)

如果数组存在,只需添加1:

def word_count(s, w):
   return sum(1 for word in s.strip().split() if w == word)

关于他无法使用len的问题,他必须使用和。

答案 2 :(得分:2)

像阿德里亚诺这样的其他人给出了很好的答案。

如果你想要完成的是计算' it'的出现次数,你可以使用count(substr)函数作为字符串。

在你的情况下,

print(dickens.lower().count('it')) # prints 13

编辑:添加lower(),感谢coldspeed!

答案 3 :(得分:-4)

使用列表推导的长度。

def word_count(s, w):
    return sum([1 for word in s.strip().split() if w == word ])
print(word_count(dickens, "it"))