假设我有一个列表 l
,其中包含 [5, 10, 15, 16, 20]
。我想获得所有可以被 5
整除的第一个元素(所以前三个元素),而不是最后一个 20
。我该怎么做呢?我已经完成了:
done = False
i = 0
while not done and i < len(l):
if l[i] % 5 == 0:
answer.append(source[i])
else:
done = True
i += 1
然而,这似乎效率低下。有没有更好的方法来做到这一点?
答案 0 :(得分:7)
itertools.takewhile
函数看起来像您想要的:
from itertools import takewhile
list(takewhile(lambda x: x % 5 == 0, [5, 10, 15, 16, 20]))
这将返回 [5, 10, 15]
。
答案 1 :(得分:3)
您的想法实际上是一个有效的答案,因为它避免了处理比需要更多的元素。 @SamEstep 的答案应该是公认的答案,因为它完全按照预期使用 itertools
,但无论如何,您的代码的正确设置如下:
l = [5, 10, 15, 16, 20]
result = []
for elem in l:
if elem % 5 == 0:
result.append(elem)
else:
break
# [5, 10, 15]
附带说明:不鼓励只索引列表的 while
循环,因为它会使您的意图不那么明确,并且会使您的代码更容易出现错误,因为您必须自己处理索引。更好的写法是这样写:
for i in range(len(l)):
为您提供列表中每个元素的索引。但是,如果您要做的只是索引列表,那么您可以遍历列表中的每个项目,这增加了可读性(这就是我上面所做的):
for elem in l:
如果您需要索引和元素,请使用enumerate
:
for idx, elem in enumerate(l):
这将使您的代码更具可读性,并且不易出错。
答案 2 :(得分:2)
在 else
代码块中使用 break
就可以了
答案 3 :(得分:0)
假设你有 myList 并且你想在其中找到可以被 n 整除的项目:
myList = [1,2,10,12,5,20]
ansList = []
ansCount = 0
for i in myList:
if i % n == 0:
# condition is true, do whaterver you want with "i"; here I added it to a new list(ansList)
ansList.append(i)
ansCount += 1
# you can also break the loop as your wish
if ansCount > 2:
break
答案 4 :(得分:0)
这并不是真的低效,但可能更清晰的方法是 -
l = [5, 10, 15, 16, 20]
result = []
for item in l:
if item % 5 == 0:
result.append(item)
else:
break
这给出了 [5, 10, 15]
答案 5 :(得分:0)
你可以使用这样的东西
mylist = [5, 10, 15, 16, 20]
result = []
for item in mylist:
if item % 5 != 0:
break
result.append(item)
print(result)