在for循环中

时间:2013-08-30 01:29:33

标签: python while-loop

我想知道首先出现在列表中的零的数量,在任何其他数字之前。

例如:
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

虽然不起作用。我认为这是一个无限循环,但我不知道为什么。

4 个答案:

答案 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提供的答案是聪明的,有用的,有用的,可能是你想要用于非常大的列表的,但是因为看起来你只是在学习语言(并且可能是学习您的第一语言),值得学习如何正确使用forwhileif

答案 3 :(得分:0)

你正在思考的是,正常情况下继续进行,直到不满足条件为止。它真正做的是,将while内部的代码重复为循环,直到不满足条件。

这是我的解决方案,它尝试尽可能与你的工作方式相同,通过进行计数,直到数字不是0,然后查看它到达多远并突破for循环。

k = 0
for index,item in enumerate(L1):
    if item != 0:
        k = len(L1[:index])
        break