这个列表的len()不正确:Python

时间:2013-10-05 07:11:45

标签: python list

我正在尝试计算“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 个答案:

答案 0 :(得分: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循环永远不会达到它,因为列表的长度/顺序发生了变化。

答案 1 :(得分: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个输出。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

这样,当您迭代集合并同时删除其元素时,您将不会遇到问题。或者,正如其他一些用户所指出的那样,我使用count功能(虽然我以前也不知道 - 感谢所有在这个帖子中展示过它的人)。

P.S。在我看来,生成器表达式是更高级别的结构,应该使用而不是循环(是的,我知道在某些情况下,当循环结构将为您提供更清晰的代码时 - 您应该始终认为最好的方法是什么写下来)。