0

我试图计算“fizz”这个词出现在我的列表中的次数。这是代码:

def fizz_count(key):
    for x in key:

        if x != 'fizz':
            key.remove(x)
            return len(key)

print fizz_count(["fizz",0,0,0,10])

但是,这将返回 4 而不是 1。对我的代码有帮助吗?

4

4 回答 4

6

一旦函数返回一些东西,它就会中断。因此,当您这样做时return len(key),您会在删除第一个 后返回列表的长度0

如果您想计算列表中出现的次数,只需执行key.count('fizz')


在迭代列表时,您永远不应该从列表中删除项目。看看如果你继续你的循环会发生什么,还有更多的"fizz"es:

>>> key = ['fizz', 1, 2, 3, 'fizz', 4]
>>> for x in key:
...     if x != 'fizz':
...             key.remove(x)
...             print key # Print the list after an item is removed.
... 
['fizz', 2, 3, 'fizz', 4]
['fizz', 2, 'fizz', 4]
['fizz', 2, 'fizz']

请注意它是如何从未删除的2?因为 for 循环从未完成它,因为列表的长度/顺序发生了变化。

于 2013-10-05T07:13:21.433 回答
2

首先,您应该使用标准库的 count 方法来做同样的事情:

["fizz",0,0,0,10].count("fizz")

它应该返回 1。但是,如果您想使用自己的逻辑,那么这里是更新的:

def fizz_count(key):
    for x in key:
        if x != 'fizz':
            key.remove(x)
    return len(key)

print fizz_count(["fizz",0,0,0,10])

if 块中的 return 语句使函数在您发现第一个与“fizz”不匹配的元素时返回。因此,由于您有一个包含 5 个元素的列表,因此您将始终得到 4 个作为输出。

于 2013-10-05T07:45:53.660 回答
1

它返回4而不是1因为缩进导致return成为条件的一部分if

于 2013-10-05T07:14:03.083 回答
1

我可能会通过生成器表达式编写此函数,如下所示:

def fizz_count(key):
    return len([x for x in key if x == 'fizz'])

这样,您就不会遇到在迭代集合并同时删除其元素时发生的问题。或者,正如其他一些用户指出的那样,我会使用count函数(虽然我以前不知道它 - 感谢在这个线程中展示它的每个人)。

PS 在我看来,生成器表达式是更高级别的构造,应该使用而不是循环(是的,我知道在某些情况下循环构造会给你更清晰的代码 - 你应该始终思考什么是最好的编写方式它)。

于 2013-10-05T07:31:18.577 回答