如何找到列表中第二低和第二高的元素?

2024-06-23 00:30:30 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,该函数可以正常工作,但列表中min2(第二个最小值)的输出不正确。我似乎找不到解决办法。 Python 3.8.6

def max2min2(list1):
    max1=list1[0]
    min1=list1[0]
    max2=None
    min2=None
    for item in list1:
        if item>max1:
            max2=max1
            max1=item
        elif max2==None or max2<item:
            max2=item
        if item<min1:
            min2=min1
            min1=item
        elif min2==None or min2>item:
            min2=item
    return max2,min2

list1 = [1,2,3]
max2,min2=max2min2(list1)
print(min2,max2) # 1 2

对于[1,2,3]的简单输入列表,maxmin2的输出是(1,2),尽管预期的输出是(2,2)


Tags: or函数none列表ifdefitemelif
2条回答

一个简单易读的解决方案是首先对列表进行排序,然后直接索引所需的值。我添加了一个unique参数,该参数指定是查看数值(最直观的)还是在列表中保留重复值(因此[1,2,2]中第二高的数值是2

def second_lowest_and_highest_using_sort(nums, unique=True):
    if unique:
        nums = list(set(nums))

    if len(nums) == 1:
        raise ValueError('Second lowest/highest number is undefined for a list of length 1.')

    nums = sorted(nums)
    return (nums[1], nums[-2])

没有先排序的更详细的方法:

def second_lowest_and_highest(nums, unique=True):
    if unique:
        nums = list(set(nums))

    if len(nums) == 1:
        raise ValueError('Second lowest/highest number is undefined for a list of length 1.')

    lowest, highest = float('inf'), float('-inf')
    second_lowest, second_highest = None, None

    low_delta, high_delta = float('inf'), float('inf')

    for num in nums:
        low_delta_new = num - lowest
        if low_delta_new < 0:
            second_lowest = lowest
            lowest = num
        elif low_delta_new <= low_delta:
            second_lowest = num
            low_delta = low_delta_new

        high_delta_new = num - highest
        if high_delta_new > 0:
            second_highest = highest
            highest = num
        elif high_delta_new <= high_delta:
            second_highest = num
            high_delta = high_delta_new

    return (second_lowest, second_highest)

现在,若这不需要进行速度优化,简单的方法就是获取一组数字,对它们进行排序,然后从每一端获取第二个元素:

vals = [1,1,3,2,2]
filtered_vals = sorted(set(vals))

然后

# Second lowest
In [37]: filtered_vals[1]
Out[37]: 2

# Second highest
In [36]: filtered_vals[-2]
Out[36]: 2

如果需要,添加一些异常和特殊情况处理

相关问题 更多 >