如何将列表转换为元组并查找最大值和最小值

0 投票
3 回答
961 浏览
提问于 2025-04-16 11:55

我现在正在学习Python编程,遇到一个问题在一个学习网站上:

创建一个函数,这个函数可以接收一系列输入(可以是列表、元组,或者一堆输入)。这个函数应该返回列表中的最小值和最大值。

以下是一些测试值:

minmax(5,4) 4,5

minmax(5,4,8,3,5,7,4) 3,8

minmax([5,4,6]) 4,6

minmax(5.1,4.2,68.34,129.1,-90.3) -90.3,129.1

我尝试过这样做,但是当参数是一个列表时,我似乎无法将其转换为元组来找到最大值和最小值。以下是我尝试的代码:

def minmax(*a):

    b = tuple(a)

    minNum = min(b)

    maxNum = max(b)

    c = (minNum, maxNum)

    return c

当输入一个列表时,返回的结果是 ([5, 4, 6], [5, 4, 6])

3 个回答

0

一个更简单但功能稍弱的解决方案,与我之前的方案类似:

def minmax(*a):
    if len(a) == 1:  # Single (list or tuple) argument
        return (min(a[0]), max(a[0]))
    return minmax(a)  # Single tuple argument given to minmax()

这个版本要求 min() 函数只能接收一个参数,这个参数可以是一个列表或元组。

它的行为和内置的 min()max() 函数一样:比如 min(42)max(42) 都会报错:

>>> minmax(3, 5, 1, 10)
(1, 10)
>>> minmax([3, 5, 1, 10])
(1, 10)
>>> minmax((42, 123, -12))
(-12, 123)
>>> minmax(42)
TypeError: 'int' object is not iterable
>>> min(42)
TypeError: 'int' object is not iterable
1

为了能够处理不同的传参方式,你需要设置一些条件来应对每种情况。

>>> def minmax(*a):
...     if len(a) == 1 and hasattr(a[0], '__getitem__'):
...         # handle a single sequence passed in
...         return min(a[0]), max(a[0])
...     # handle values passed in
...     return min(a), max(a)
...
>>> minmax(5, 4)
(4, 5)
>>> minmax(5, 4, 8, 3, 5, 7, 4)
(3, 8) 
>>> minmax([5, 4, 6])
(4, 6)
>>> minmax(5.1, 4.2, 68.34, 129.1, -90.3)
(-90.3, 129.1)
2
def minmax(*a):

    if len(a) == 1:  # Single (list, tuple, or scalar) argument
        try:
            return minmax(*a[0])  # Expansion of sequence elements, if possible
        except TypeError:  # Case of minmax(42)
            pass  # The general code below handles this directly

    return (min(a), max(a))

>>> minmax(3, 5, 1, 10)
(1, 10)
>>> minmax([3, 5, 1, 10])
(1, 10)
>>> minmax((42, 123, -12))
(-12, 123)
>>> minmax(42)
42

这个方法在很多情况下比内置的 min()max() 更有效,因为后者在只有一个数字时(比如 min(42))是无法工作的。

>>> min(42)
TypeError: 'int' object is not iterable

不过,我们可以写一个更简单的版本,让它的表现和内置的 min()max() 一样(比如看看我其他的回答)。

这个方法的原理是强制 min() 至少接收两个以上的元素,除了特殊情况 minmax(42),它会调用 min((42,))

撰写回答