1

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

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

4 回答 4

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
于 2013-08-30T01:31:05.470 回答
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优惠是非常值得的。

于 2013-08-31T22:26:43.787 回答
0

我的回答扩展了 paxdiablo 的。感谢他澄清了我误读的 L2 案例的 OP 意图。

虽然itertools对于这种事情很方便,但就你而言,我想说掌握基本的语言特性是值得的。

在您的代码中,您可以这样做:

L1 = [0, 0, 0, 0, 0, 1, 2]

k = 0
for i in L1:
    while i == 0:
        k = k + 1

当您在 上运行那段代码时L1,它会永远循环。原因如下:

for导致封闭的代码(意味着下面的代码被缩进留出)循环。因此,您的for i in L1:循环为 L1 中的每件事运行一次缩进它下面的所有内容。

但是,while做类似的事情。 while告诉 Python 一遍又一遍地运行它下面的缩进代码,直到while语句的条件为False.

因此,在 的情况下L1,第一次通过for循环时,i被设置为 0。然后,while i == 0:表示要执行包含的代码k = k + 1,一遍又一遍,直到i不再为零。不幸的是,由于while循环中的代码不会改变 的值ii直到时间结束都将为零,所以它会永远运行,重复地将 1 加 1 k

您正在寻找的是一个if不会循环的语句。它会根据其测试是否为真来运行随附的代码。所以,而不是:

    while i == 0:
        k = k + 1

您可以使用

    if i == 0:
        k = k + 1
    else:
        break

然后,每次for循环时,代码都会询问是否i为零,如果是,则仅一次,将 加一k,然后继续下一个列表元素。为了涵盖您的 L2 案例,如果您遇到的数字不为零,则break退出for循环并停止计数。

给出的答案itertools很聪明,有用,很容易知道,并且可能是您想在非常大的列表中使用的答案,但是由于您似乎只是在学习该语言(并且可能是在学习您的第一语言),因此值得学习如何正确使用forwhileif

于 2013-08-31T23:02:15.120 回答
0

您正在考虑的事情是照常进行,直到不满足条件为止。它真正的作用是将while 内的代码作为循环重复,直到条件不满足。

这是我的解决方案,它试图与您的解决方案尽可能相似,通过继续计数直到数字不是 0,然后查看它的距离并跳出 for 循环。

k = 0
for index,item in enumerate(L1):
    if item != 0:
        k = len(L1[:index])
        break
于 2013-09-01T10:54:52.760 回答