计算并返回第二大数字和第二小数字之间的差

时间:2019-04-08 09:20:03

标签: python sorting nested-lists numpy-slicing

给出一个Python列表,计算并返回第二大数字和第二小数字之间的差。假设列表包含两个或多个元素。 功能规格: 第二个最大/最小数字必须与列表中的最大/最小数字不同。那就是:

difference([10, 10, 10, 8, 5, 2, 1, 1, 1]) == 8 - 2 == 6

应将列表作为输入。

def difference(list1):

    # Your code here

    return* 

2 个答案:

答案 0 :(得分:1)

首先,我们构造一个给定列表中的集合以删除重复的值,然后对它们进行排序以轻松找到第二个最高和最小的值。

def difference(list1):
    list1 = sorted(set(list1))
    print(list1) # --> [1, 2, 5, 8, 10]

    if list1[1] != list1[-2]:
        return list1[-2] - list1[1]

print(difference([10, 10, 10, 8, 5, 2, 1, 1, 1]) == 8 - 2 == 6) # --> True

答案 1 :(得分:0)

这是一种简单但不是最有效的方法。您可以通过两步来实现:

  1. list转换为set,以删除重复的数字。
  2. 使用heapnlargest中找到nsmallestset
def difference(list1):
    set1 = set(list1)
    return heapq.nlargest(2, set1)[1] - heapq.nsmallest(2, set1)[1]

这是一种单向方式,更有效,使用4个变量:

def difference(list1):
    max1, max2, min1, min2 = float('-inf'), float('-inf'), float('inf'), float('inf')
    for x in list1:
        if x > max1:
            max1, max2 = x, max1
        elif x >= max2 and x != max1:
            max2 = x

        if x < min1:
            min1, min2 = x, min1
        elif x <= min2 and x != min1:
            min2 = x

    return max2 - min2

测试并输出:

print(difference([10, 10, 10, 8, 5, 2, 1, 1, 1]))
# 6

希望对您有所帮助,如果还有其他问题,请发表评论。 :)