我试图检查两个数字列表在同一索引处的两个值中的任何一个是否至少为60。这是我的代码:
def list_list(x,y):
z=zip(x,y)
l=[list(x) for x in z]
print(l)
for el in l:
print(el)
if el[0]>=60 or el[1]>=60:
el.append('pass')
return el
else:
el.append('fail')
return el
print(list_list(x=[28, 59, 22, 5],
y=[59, 85, 55, 60]))
当我运行此代码时,它只返回[28,59,'fail']
,不返回其他剩余列表。它还应该返回[59, 85, 'pass']
,[22, 55, 'fail']
和[5, 60, 'pass']
。
为什么我的功能会在第一个结果后停止?
答案 0 :(得分:1)
当您在函数中说return
时,您正在退出该函数。如果你参加派对并返回,你还没有参加派对。您可以将return
更改为yield
以创建生成器函数,但您可能需要创建自己的列表:
def list_list(x,y):
z=zip(x,y)
l=[list(x) for x in z]
returnlist = []
print(l)
for el in l:
print(el)
if el[0]>=60 or el[1]>=60:
el.append('pass')
returnlist.append(el)
else:
el.append('fail')
returnlist.append(el)
return returnlist
print(list_list(x=[28, 59, 22, 5],
y=[59, 85, 55, 60]))
答案 1 :(得分:1)
您的代码存在一些问题。最明显的一点就是,当你说return
时,你的函数会恢复正常。一旦函数遇到return语句,就不会执行以下任何行。
此外,无需从l
的返回值构建列表zip
,您可以直接迭代zip
生成的元组。
有两种方法可以防止您的功能过早返回。第一个是构建一个结果列表,你追加中间结果并在结尾返回结果列表:
def list_list(x,y):
result = [] # make an empty list to store results
for a,b in zip(x,y):
# decide pass or fail
if a >= 60 or b >= 60:
word = 'pass'
else:
word = 'fail'
# append to result list
result.append([a, b, word])
# return result list
return result
或者,您可以构造一个生成器,在计算中间时吐出中间结果:
def list_list(x,y):
for a,b in zip(x,y):
# decide pass or fail
if a >= 60 or b >= 60:
word = 'pass'
else:
word = 'fail'
# yield intermediary result
yield [a, b, word]
print(list(list_list([28, 59, 22, 5], [59, 85, 55, 60]))) # [[28, 59, 'fail'], [59, 85, 'pass'], [22, 55, 'fail'], [5, 60, 'pass']]
当然,所有这一切都可以通过列表理解来完成:
>>> x=[28, 59, 22, 5]
>>> y=[59, 85, 55, 60]
>>> [[a,b,'pass'] if a >= 60 or b >= 60 else [a,b,'fail'] for a,b in zip(x,y)]
[[28, 59, 'fail'], [59, 85, 'pass'], [22, 55, 'fail'], [5, 60, 'pass']]
最后的说明:
在Python2中,考虑使用itertools.izip
代替zip
而不是zip
,因为您不需要list_list
的完整元组列表。
考虑使用更好的功能名称。 atleast_sixty_pairs
告诉我函数应该做什么。 {{1}}或类似的东西怎么样?