如何在不使用循环的情况下在python中查找列表中的最大值

时间:2017-12-18 03:38:32

标签: python functional-programming list-comprehension

我试图使用列表推导找到给定数字列表中的两个最大元素。

这是我到目前为止所尝试的。我也试过使用过滤器'代替这个功能。

def top_two(l):
    l1 = [lambda x,y:x > y for x in l]
    return l1

我也试过这样的事情,但它也没有用。

def top_two(l):
    l1 = [l[x] for x in range(len(l)) for y in l[x:] if l[x] > y]

任何帮助将不胜感激!

编辑 我没想过简单地整理它!我将使用列表推导对其进行排序并提取最大值。谢谢!

2 个答案:

答案 0 :(得分:1)

您可以简单地对列表进行排序并获得最大的两个数字。我从here

复制并粘贴了冒泡排序代码
def top_two(l):
    for n in range(len(l)-1,0,-1):
        for i in range(n):
            if l[i]>l[i+1]:
                temp = l[i]
                l[i] = l[i+1]
                l[i+1] = temp
    return l[-1],l[-2]

答案 1 :(得分:0)

排序是一种解决方案,但对于长列表,它可能比需要的更昂贵,因为它不是线性的。 Python远不是FP最优雅的语言,但您可以使用reduce一次性找到最大的元素。

def add_largest_to_pair(pair, num):
    # This function takes a pair and a number and returns a pair made of the two largest of those three
    if pair[1] > num >= pair[0]:
        return (num, pair[1])
    elif num >= pair[1]:
        return (pair[1], num)
    else:
        return pair

def top_two(l):
    return reduce(
        add_largest_to_pair,
        l,
        (float('-inf'), float('-inf'))
    )

这将返回两个最大值的元组,pair[0]是第二大值,pair[1]是最大值。请注意,这假设您的列表至少有两个长度。

注意:如果您使用的是Python3,则必须使用functools.reduce