python为什么max(max(float_2d_array))给出了错误的答案?

时间:2017-05-04 12:24:47

标签: python matrix floating-point max

例如:

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.7965388321000092, 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.7965388321000092,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。

非常感谢。

2 个答案:

答案 0 :(得分:6)

列表按元素排序。由于1.2852976787772832的索引比候选子列表中6.409872844109646的索引高一个位置,因此包含前者的列表将被选为最大值。

在第二个列表的同一个索引中,我们有一个01.2852976787772832显然大于0:

[0.0, 0.0, 1.2852976787772832, 0.7965388321000092, 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 :(得分:1)

摩西已经解释了为什么你得到了错误的结果:比较列表时,第一个元素比另一个元素“胜出”。

要获得最大值,您必须展平您的列表:

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