我正在编写一个函数,它将列表中的元素返回到所述列表中的第一个偶数。
def up_to_even(list):
new_list = []
for num in list:
if num % 2 != 0:
new_list.append(num)
else:
return new_list
我做错了什么?
答案 0 :(得分:3)
您当前的功能正常。当找到偶数时,它会停止向结果列表中添加元素。
但是,在这里使用for
循环是受控迭代,只有在您想要检查列表中的每个元素时才需要它。这就是为什么你当前的函数需要有一个特殊的else
案例才能特别突破循环并返回结果列表。
由于您不知道何时遇到偶数,您可以使用while
循环,也称为非受控迭代。
以下是一个例子:
lst = [1, 3, 5, 7, 8]
i = 0
result = []
while lst[i] % 2 != 0:
result.append(lst[i])
i += 1
print(result)
# [1, 3, 5, 7]
请记住,您始终可以使用itertools.takewhile()
来执行此操作:
import itertools
lst = [1, 3, 5, 7, 8]
result = list(itertools.takewhile(lambda x : x % 2 != 0, lst))
print(result)
# [1, 3, 5, 7]
注意:在这里使用lambda
只是在现场创建一个匿名函数。如果您不想使用它,您可以创建自己的帮助函数:
def evens(x):
return x % 2 != 0
以同样的方式致电itertools.takewhile()
:
result = list(itertools.takewhile(evens, lst))
答案 1 :(得分:2)
如果列表中没有偶数,你就不会考虑这种情况,在这种情况下它永远不会到达else
,因此没有返回任何列表,修复它只是添加一个在功能结束时返回
def up_to_even(lst):
new_list = []
for num in lst:
if num % 2 != 0:
new_list.append(num)
else:
return new_list # or use break
return new_list
这里有一些测试
>>> up_to_even([1,3,4])
[1, 3]
>>> up_to_even([1,3,4,5])
[1, 3]
>>> up_to_even([1,3,41,5])
[1, 3, 41, 5]
>>>
答案 2 :(得分:1)
当没有'偶数'时,你的函数返回'无',所以这里是几行代码的更新版本:
如果数据是:
a=[1,3,5,7,9,2,33,77]
代码:
def up_to_even(list_1):
new_list=[]
for i in list_1:
if i%2!=0:
new_list.append(i)
else:
break
return new_list
print(up_to_even(a))
输出:
[1, 3, 5, 7, 9]
P.S:不要将变量名称用作'list','list'是python中的关键字。
答案 3 :(得分:0)
在python3中
form itertools import takewhile
def up_to_even(lst):
return list(takewhile(lambda x: x%2, lst)