我试图计算“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。对我的代码有帮助吗?
一旦函数返回一些东西,它就会中断。因此,当您这样做时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 循环从未完成它,因为列表的长度/顺序发生了变化。
首先,您应该使用标准库的 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 个作为输出。
它返回4
而不是1
因为缩进导致return
成为条件的一部分if
。
我可能会通过生成器表达式编写此函数,如下所示:
def fizz_count(key):
return len([x for x in key if x == 'fizz'])
这样,您就不会遇到在迭代集合并同时删除其元素时发生的问题。或者,正如其他一些用户指出的那样,我会使用count
函数(虽然我以前不知道它 - 感谢在这个线程中展示它的每个人)。
PS 在我看来,生成器表达式是更高级别的构造,应该使用而不是循环(是的,我知道在某些情况下循环构造会给你更清晰的代码 - 你应该始终思考什么是最好的编写方式它)。