2015-05-02 81 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