2017-05-04 127 views
3

例如:python爲什麼max(max(float_2d_array))給出錯誤的答案?

a = [[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 1.2852976787772832, 0.00092, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 6.409872844109646, 0.17506688391255013, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]] 
print max(max(a)) 
print max(a) 

結果是:

1.28529767878

[0.0,0.0,1.2852976787772832,0.00092,0.0,0.0,0.0,0.0,0.0]

這顯然是錯誤的,最多值應爲6.409872844109646。

b = [] 
for i in a: 
    b.extend(i) 
print max(b) 

6.40987284411

這是Python 2.7版,CPython的。

非常感謝。

+0

你爲什麼期待6.409872844109646? .... 1.2852976787772832看起來像我的最大 – depperm

+0

你可以用numpy得到正確答案:'print numpy.max(a)' – Nuageux

+3

你對max(a)的期望是不正確的。它不會給你具有最大數量的列表。 – yeniv

回答

6

列表進行排序逐個元件。由於1.2852976787772832指數是領先於在候選子列表6.409872844109646一個地方,包含前者名單得到回升爲最大。

在第二列表中的同一個索引,我們有一個01.2852976787772832顯然大於0:

[0.0, 0.0, 1.2852976787772832, 0.00092, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 6.409872844109646, 0.17506688391255013, 0.0, 0.0, 0.0, 0.0] 
#   ^here's your tie-breaker 

事實上,從來沒有檢查包含6.4...下一個索引。

我不知道你怎麼想到要選擇的最大子表:子表與最大總和,包含最大數目的子表?如果默認行爲不能削減它,你將不得不編碼你想要的行爲。

+1

當您比較數字列表和字符串(出於說明目的)可以被視爲字符列表時,也許機制變得更加明顯。按字母順序,「aba」出現在「aac」之後。排在「002」後面的「010」也是如此。 – aleneum

+1

Got it!謝謝,摩西! – user7586189

1

摩西已經解釋爲什麼會得到錯誤的結果:比較列表時,第一個元素比其他「贏」更大。

爲了讓你有最大值壓扁列表:

print(max(x for l in a for x in l)) 
+0

是的,那也行得通! –

+0

說實話,我很少_had_使用'key'用'max'。只有當你需要一個與最大值有關的數據時,它纔有意義,但不是數值本身。 –