我有以下值列表列表,我想在所有值中找到最小值.
Q = [[8.85008011807927, 4.129896248976861, 5.556804136197901],
[8.047707185696948, 7.140707521433818, 7.150610818529693],
[7.5326340018228555, 7.065307672838521, 6.862894377422498]]
Run Code Online (Sandbox Code Playgroud)
我打算做以下事情:
min(min(Q))
Run Code Online (Sandbox Code Playgroud)
我在一个较小的例子上尝试了这种方法,它可以工作:
>>>b = [[2,2],[1,9]]
>>>min(b)
[1, 9]
>>>min(min(b))
1
Run Code Online (Sandbox Code Playgroud)
但是在原始列表Q上使用它会返回错误的结果:
>>> min(Q)
[7.5326340018228555, 7.065307672838521, 6.862894377422498]
>>> min(min(Q))
6.862894377422498
Run Code Online (Sandbox Code Playgroud)
为什么这种方法错了,为什么?
列表使用它们的词典顺序1进行比较(即比较第一个元素,然后是第二个元素,然后是第三个元素,依此类推),因为list_a < list_b 这并不意味着最小元素中的元素list_a小于最小元素list_b,这就是为什么你的方法在一般情况下不起作用.
例如,考虑一下:
>>> l1 = [3, 0]
>>> l2 = [2, 1]
>>>
>>> min(l1, l2)
[2, 1]
Run Code Online (Sandbox Code Playgroud)
其理由min(l1, l2)是[2, 1],因为第一个元素l1(3)初始与比较l2(2).现在2 < 3,所以l2返回为最低,没有任何进一步的比较.但是,它l1确实包含两个列表中的最小数字(0),它出现在初始元素之后.因此,采取min的min(l1, l2)给我们的不正确的结果1.
解决这个问题的一个好方法是找到"扁平"列表的最小值,这可以通过生成器获得:
>>> Q = [[8.85008011807927, 4.129896248976861, 5.556804136197901],
... [8.047707185696948, 7.140707521433818, 7.150610818529693],
... [7.5326340018228555, 7.065307672838521, 6.862894377422498]]
>>>
>>> min(a for sub in Q for a in sub) # <--
4.129896248976861
Run Code Online (Sandbox Code Playgroud)
(+1到@Ffisegydd首先在这些行上发布解决方案.)
1来自http://docs.python.org/3/tutorial/datastructures.html#comparing-sequences-and-other-types:
可以将序列对象与具有相同序列类型的其他对象进行比较.比较使用词典排序:首先比较前两个项目,如果它们不同,则确定比较的结果; 如果它们相等,则比较接下来的两个项目,依此类推,直到任一序列用完为止.如果要比较的两个项本身是相同类型的序列,则递归地执行词典比较.如果两个序列的所有项比较相等,则认为序列相等.如果一个序列是另一个序列的初始子序列,则较短的序列是较小的(较小的)序列.
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |