2017-05-04 130 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'。只有当你需要一个与最大值有关的数据时,它才有意义,但不是数值本身。 –