如何将列表转换为元组并查找最大值和最小值
我现在正在学习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,))
。