Is it possible to have multiple statements in a python lambda expression?

后端 未结 18 1941
感情败类
感情败类 2020-12-12 21:33

I am a python newbie trying to achieve the following:

I have a list of lists:

lst = [[567,345,234],[253,465,756, 2345],[333,777,111, 555]]

18条回答
  •  伪装坚强ぢ
    2020-12-12 22:01

    There are several different answers I can give here, from your specific question to more general concerns. So from most specific to most general:

    Q. Can you put multiple statements in a lambda?

    A. No. But you don't actually need to use a lambda. You can put the statements in a def instead. i.e.:

    def second_lowest(l):
        l.sort()
        return l[1]
    
    map(second_lowest, lst)
    

    Q. Can you get the second lowest item from a lambda by sorting the list?

    A. Yes. As alex's answer points out, sorted() is a version of sort that creates a new list, rather than sorting in-place, and can be chained. Note that this is probably what you should be using - it's bad practice for your map to have side effects on the original list.

    Q. How should I get the second lowest item from each list in a sequence of lists?

    A. sorted(l)[1] is not actually the best way for this. It has O(N log(N)) complexity, while an O(n) solution exists. This can be found in the heapq module.

    >>> import  heapq
    >>> l = [5,2,6,8,3,5]
    >>> heapq.nsmallest(l, 2)
    [2, 3]
    

    So just use:

    map(lambda x: heapq.nsmallest(x,2)[1],  list_of_lists)
    

    It's also usually considered clearer to use a list comprehension, which avoids the lambda altogether:

    [heapq.nsmallest(x,2)[1] for x in list_of_lists]
    

提交回复
热议问题