迭代列表列表 - 只返回四个列表中的一个列表

时间:2016-03-05 17:15:20

标签: python list tuples

我试图检查两个数字列表在同一索引处的两个值中的任何一个是否至少为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']

为什么我的功能会在第一个结果后停止?

2 个答案:

答案 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}}或类似的东西怎么样?