Python内置模块min和max的混淆问题

4

我需要编写一个名为shortest()的函数,用于查找字符串列表中最短字符串的长度。

函数shortest()接受一个参数: 1. 字符串列表textList

函数shortest()应该返回textList中最短字符串的长度。你可以假定textList至少包含一个元素(字符串)。

例如,以下内容将是正确的输出:

>>> beatleLine = ['I', 'am', 'the', 'walrus']
>>> print(shortest(beatleLine))
1

在编写完shortest()函数后,我想出了这个解决方案

def shortest(textList):
    return len(max(textList))

string = ['Hey', 'Hello', 'Hi']
print(shortest(string))

但是我对于max函数返回最短函数的长度而不是min函数感到困惑。

如果我将max改为min,则返回最大值。似乎min和max被交换了。

我正在使用Python 3.4,在IDLE上运行。

2个回答

4

max用于返回可迭代对象中最大的元素。由于您没有提供任何用于比较大小的key函数,它将返回字典序最大的元素:

>>> max(['I', 'am', 'the', 'x', 'walrus'])
'x'

您需要告诉max使用哪个键函数来比较元素,以决定谁是最大的。
>>> max(['I', 'am', 'the', 'walrus', 'x'], key=len)
'walrus'

说到这一点:
>>> def shortest(textList):
...     return len(min(textList, key=len))

使用列表推导式或 map 的替代方法:

>>> min(len(text) for text in textList)

--

>>> min(map(len, textList))

1
甚至更好的写法是:return min(len(text) for text in textList) - freakish
or min(map(len, textList)) - Ozgur Vatansever
1
你犯了一个错误。默认比较的不是“列表中的最后一个元素”,而是“按字典顺序排列的最大元素”。这就是为什么x无论在列表中的位置如何,都是最大的原因。 - freakish
顺便问一下,你认为将生成器传递给min函数比使用“key”函数更好的原因是什么?代码可读性、性能? - Ozgur Vatansever
“key” 仅用于比较,而不修改对象。使用列表推导式实际上是在转换对象,因此不再需要外部的 “len(...)”。这只是一个微小的改进,但在我看来更具性能和可读性。 - freakish

0

如果您像函数一样比较字符串本身(即对列表进行排序并显示它),您会发现它们按特定方式排序,从而得到您看到的结果。

您需要使用key参数传递一个函数,该函数将返回项的长度而不是使用项本身。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接