我想知道在任何其他数字之前首先出现在列表中的零的数量。
例如:
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
但它不起作用。我认为这是一个无限循环,但我不知道为什么。
我想知道在任何其他数字之前首先出现在列表中的零的数量。
例如:
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
但它不起作用。我认为这是一个无限循环,但我不知道为什么。
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
正如其他评论员所说,您的代码中的问题是您似乎误解了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
优惠是非常值得的。
我的回答扩展了 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
循环中的代码不会改变 的值i
,i
直到时间结束都将为零,所以它会永远运行,重复地将 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
很聪明,有用,很容易知道,并且可能是您想在非常大的列表中使用的答案,但是由于您似乎只是在学习该语言(并且可能是在学习您的第一语言),因此值得学习如何正确使用for
、while
和if
。
您正在考虑的事情是照常进行,直到不满足条件为止。它真正的作用是将while 内的代码作为循环重复,直到条件不满足。
这是我的解决方案,它试图与您的解决方案尽可能相似,通过继续计数直到数字不是 0,然后查看它的距离并跳出 for 循环。
k = 0
for index,item in enumerate(L1):
if item != 0:
k = len(L1[:index])
break