对 max() 内置函数感到困惑

confused about max() built in function

你好我对 max() 函数有点困惑,我有以下代码:

a = '9:30'
b = '10:44'
c = '8:22'
x = max(a, b, c)
print (x)

所以我的问题是:为什么会这样 return 9:30?如果我要从 max 中删除 a 它将 return 8:22

字符串 a 比较最大,因为它以 9 开头,而其他字符串以 18 开头。 Python 因此 returns '9:30' 作为这三个字符串中的最大值。

因为它的参数是字符串,所以它返回按字母顺序排列的最新字符串。

它正在比较字符串,因此,它首先比较第一个字符,然后,如果该字符相同,则移动到下一个,然后是下一个,依此类推。

所以 '9:30' 是 return 编辑的,因为 9 > 8 > 1。如果你想从“10:44”到 return,那么你应该使用 datetime模块,除非您想为此编写自定义代码

编辑:并被打字速度更快的人狙击!

当您进行字符串比较时,'9'intASCII 值大于 '8''1'。您可以使用 ord 内置函数查看单个字符的 int 值。

>>> ord('9')
57
>>> ord('1')
49
>>> ord('8')
56

并且 Python 以 lexicographical 方式进行比较(每个字符从左到右)。它发现 '9' 的值更大。如果发现 '8' 的值大于 '1'.

,则删除 '9'

实现的一种方法可能是:-

a = '9:30'
b = '10:44'
c = '8:22'
d = '10:55'

print max([a, b, c, d], key=lambda x: map(int, x.split(':')))

您比较的是字符串,而不是数字或时间。因此,它通过第一个字符比较字符串(如果相等,则通过第二个字符,依此类推),"9:30" 的第一个字符是最高的。

如果你想比较时间,你可以split :符号处的字符串,map部分为整数并比较它们,使用相应的key函数。

x = max([a, b, c], key=lambda s: map(int, s.split(":")))

因为 max 函数会按字典顺序查找最大值,您可以使用 max 函数的适当键将小时和分钟转换为 int.

>>> l=[a,b,c]
>>> max(l,key=lambda d :map(int, d.split(":")))
'10:44'

这是另一种方法,因此您可以只使用常规 max 函数。首先,填充字符串,使 "9" 变为 "09""10" 保持 "10"。您可以为此使用 str.zfill

a = '9:30'
b = '10:44'
c = '8:22'
a, b, c = map(lambda s: s.zfill(5), (a, b, c))

现在,它们将是您想要的字典顺序!

print(max([a, b, c]))
10:44

你只需要填充一次,但你会被卡住:

print(min([a, b, c]))
08:22