2015-05-02 78 views
2

你好,我是那种困惑的MAX()函数,我有以下代码:困惑MAX()内置函数

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

所以我的问题是:为什么这个回报9:30?如果我是从内部最大删除一个它将返回8:22

+4

字典顺序,' “9”'是比' “1”'' –

+1

了','B大'和'c'不是时间;他们只是字符串。 – chepner

+1

正如@chepner在上面提到的,你可能想用'time'而不是字符串。请参阅https://docs.python.org/2/library/time.html – bentank

回答

5

字符串a比喻为最大的,因为它与9开始和其他琴弦与18开始。因此,Python返回'9:30'作为这三个字符串中的最大值。

0

由于它的参数是字符串,它返回字母顺序最新的字符串。

0

它比较字符串,并且,因此,它开始通过比较第一字符,然后,如果该字符是相同的,

因此移动到下一再下等等等等' 9:30'返回,因为9> 8> 1。如果你想要“10:44”返回,那么你应该使用datetime模块,除非你想编写自定义代码,编辑:

edit:and sniped by打字速度更快的人!

2

当你在做字符串比较'9'intASCII值大于'8''1'更大。您可以使用ord内置函数查看单个字符的值int

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

而且Python以lexicographical的方式做比较(从左到右每个字符)。它发现价值更大的'9'。如果删除'9',如果发现'8'的值大于'1'

一种实现方式可以是: -

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(':'))) 
+0

更好地移除'[0]',否则它会比较'10:30'和'10:45'。 –

+0

@tobias_k谢谢。这确实有道理。 –

+0

另外,'lambda i:int(i)'与'int'相同。 –

0

你比较字符串,而不是数字或时间。因此,它比较字符串的第一个字符(如果这些字符相等,第二个字符等等),并且"9:30"的第一个字符是最高的。

如果你想的时候相比,你可以在:符号split字符串,map部分整数和比较这些,使用根据key功能。

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

它,因为那max功能将lexicographicaly找到最大值,您可以使用适当的键max功能到小时和分钟转换为int

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

这是另一种方法,因此您可以使用常规的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