我想知道首先出现在列表中的零的数量,在任何其他数字之前。
例如:
L1 = [0, 0, 0, 0, 0, 1, 2]
- 输出应为5,即零的数量
L2 = [1, 0, 0, 0, 0, 0, 2]
- 输出应为零。虽然此列表中有5个零,但列表以1开头。
这是我的代码:
k = 0
for i in L1:
while i == 0:
k = k + 1
虽然不起作用。我认为这是一个无限循环,但我不知道为什么。
答案 0 :(得分:5)
想想第一次i
设置为0
时会发生什么。
while
循环将开始且从不停止,因为i
未在该循环内更改。
根据以下成绩单,稍微修改一下你的成绩,你会感觉更好:
>>> list1 = [0,0,0,0,0,1,2]
>>> count = 0
>>> for item in list1:
... if item == 0:
... count = count + 1
... else:
... break
...
>>> print count
5
或稍微变短的变化会立即中断非零值,否则添加一个。:
>>> list1 = [0,0,0,0,0,1,2]
>>> count = 0
>>> for item in list1:
... if item != 0: break
... count = count + 1
...
>>> print count
5
答案 1 :(得分:2)
正如其他评论员所说,代码中的问题是您似乎误解了while
关键字的含义。除此之外,对于像这样的问题,我通常更喜欢更实用的风格:
>>> import itertools
>>> k = len(list(itertools.takewhile(lambda x: x == 0, L1)))
>>> k
5
>>> k = len(list(itertools.takewhile(lambda x: x == 0, L2)))
>>> k
0
如果您刚刚开始了解Python,那么使用itertools
提供的内容非常值得。
答案 2 :(得分:0)
我的答案扩展了paxdiablo。感谢他澄清OP对L2案件的意图,我误解了。
虽然itertools
对于这种事情很方便,但在你所处的位置,我会说掌握基本的语言功能是值得的。
在您的代码中,您执行此操作:
L1 = [0, 0, 0, 0, 0, 1, 2]
k = 0
for i in L1:
while i == 0:
k = k + 1
当你在L1
上运行那段代码时,它会永远循环。原因如下:
for
导致包含的代码(意味着下面的代码由缩进留出)循环。因此,对于L1中的每个事物,您的for i in L1:
循环会在其下方缩进所有内容。
但是,while
做了类似的事情。 while
告诉Python一遍又一遍地在其下面运行缩进代码,直到while
语句中的条件为False
。
因此,在L1
的情况下,第一次通过for
循环,i
被设置为0.然后,while i == 0:
表示执行所附的代码,k = k + 1
,一遍又一遍,直到i
不再为零。不幸的是,由于while
循环中的代码不会更改i
的值,i
将一直为零,因此它会永远运行,并重复向{k
添加一个1}}。
您正在寻找的是if
语句,它不会循环播放。它将根据其测试是否为真来运行所附的代码。所以,而不是:
while i == 0:
k = k + 1
你可以使用
if i == 0:
k = k + 1
else:
break
然后,每次通过for
循环时,代码会询问i
是否为零,如果是,仅,则会向k
添加一个然后继续下一个列表元素。为了覆盖您的L2情况,如果您输入的数字不是零,break
退出for
循环并停止计数。
itertools
提供的答案是聪明的,有用的,有用的,可能是你想要用于非常大的列表的,但是因为看起来你只是在学习语言(并且可能是学习您的第一语言),值得学习如何正确使用for
,while
和if
。
答案 3 :(得分:0)
你正在思考的是,正常情况下继续进行,直到不满足条件为止。它真正做的是,将while内部的代码重复为循环,直到不满足条件。
这是我的解决方案,它尝试尽可能与你的工作方式相同,通过进行计数,直到数字不是0,然后查看它到达多远并突破for循环。
k = 0
for index,item in enumerate(L1):
if item != 0:
k = len(L1[:index])
break