嵌套列表中的min / max函数如何工作?

时间:2015-12-02 18:17:45

标签: python list python-2.7 python-2.x nested-lists

可以说,有一个嵌套列表,如:

my_list = [[1, 2, 21], [1, 3], [1, 2]]

在此上调用函数min()时:

min(my_list)

收到的输出是

[1, 2]

为什么以及如何运作?有什么用例?

4 个答案:

答案 0 :(得分:38)

如何在Python中比较列表和其他序列?

Python中的列表(和其他序列)将与lexicographically进行比较,而不是基于任何其他参数。

  

可以将序列对象与具有相同序列类型的其他对象进行比较。比较使用词典排序:首先比较前两个项目,如果它们不同,则确定比较的结果;如果它们相等,则比较接下来的两个项目,依此类推,直到任一序列用完为止。

什么是词典排序?

来自lexicographic sorting

上的维基百科页面
  

词典或词典顺序(也称为词汇顺序,字典顺序,字母顺序或词典(al)产品)是对字母的字母顺序基于其组成字母的字母顺序的方式的概括。

min函数返回 iterable 中的最小值。因此[1,2]的词典值在该列表中是最少的。您可以使用[1,2,21]

进行检查
>>> my_list=[[1,2,21],[1,3],[1,2]]
>>> min(my_list)
[1, 2]

min的情况下发生了什么?

明确my_list上的元素,首先是[1,2,21][1,3]。现在来自文档

  

如果要比较的两个项目本身是 相同类型的序列 ,则词典比较将以 递归进行

因此[1,1,21]的值小于[1,3],因为[1,3]的第二个元素,3 按字典顺序排列[1,1,21]的第二个元素的值,即1

现在比较[1,2][1,2,21],并添加来自文档的其他参考

  

如果一个序列是另一个序列的 初始子序列 ,则 较短的序列是较小的 (较小的)一个。

[1,2][1,2,21]的初始子序列。因此,[1,2]的值总体上小于[1,2,21]的值。因此返回[1,2]作为输出。

可以使用sorted函数

验证
>>> sorted(my_list)
[[1, 2], [1, 2, 21], [1, 3]]

如果列表包含多个最小元素怎么办?

如果列表包含重复的最小元素,则返回第一个

>>> my_list=[[1,2],[1,2]]
>>> min(my_list)
[1, 2]

可以使用id函数调用

确认
>>> my_list=[[1,2],[1,2]]
>>> [id(i) for i in my_list]
[140297364849368, 140297364850160]
>>> id(min(my_list))
140297364849368

我需要做些什么来阻止min中的字典比较?

如果所需的比较不是词典,则可以使用key参数(如Padraic所述)

min函数有一个名为key附加可选参数key参数需要一个函数。

  

可选键参数指定单参数排序函数   就像用于list.sort()的那样。必须提供关键参数(如果提供)   以关键字形式(例如,min(a,b,c,key=func))。

例如,如果我们需要最小元素的长度,我们需要使用len函数。

>>> my_list=[[1,2,21],[1,3],[1,2]]
>>> min(my_list,key=len)            # Notice the key argument
[1, 3]

我们可以看到第一个最短的元素在这里返回。

如果列表是异构的,该怎么办?

直到Python2

如果列表是异构的 类型名称 ,请考虑订购,请检查Comparisions

  

除数字以外的其他类型的对象按其 类型名称排序

因此,如果您放置intlist,则会得到最小的整数值,因为i的值低于l。同样地,'1'的价值高于两者。

>>> my_list=[[1,1,21],1,'1']
>>> min(my_list)
1

Python3及以后

然而,在 Python3 中删除了这种令人困惑的技术。它现在提出TypeError 。阅读What's new in Python 3.0

  

当操作数没有有意义的自然时,排序比较运算符(<<=>=>)会引发TypeError异常排序。因此,1 < ''0 > Nonelen <= len等表达式不再有效,例如None < None提升TypeError而不是返回False。一个必然结果是 对异构列表进行排序不再有意义 - 所有元素必须相互比较

>>> my_list=[[1,1,21],1,'1']
>>> min(my_list)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < list()

但它适用于可比类型,例如

>>> my_list=[1,2.0]
>>> min(my_list)
1

我们可以看到list包含float值和int值。但由于floatint是可比类型,min函数在这种情况下有效。

答案 1 :(得分:5)

词典排序的一个简单用例是制作可排序的namedtuple类。

from collections import namedtuple
Time = namedtuple('Time', ['hours', 'minutes', 'seconds'])

t1 = Time(hours=8, minutes=15, seconds=30)
t2 = Time(hours=8, minutes=15, seconds=0)
t3 = Time(hours=8, minutes=30, seconds=30)
t4 = Time(hours=7, minutes=15, seconds=30)

assert min(t1, t2, t3, t4) == t4
assert max(t1, t2, t3, t4) == t3

答案 2 :(得分:2)

两个列表按元素进行比较

即使两个列表的大小不同,也会从第一个元素开始比较,逐个元素地比较两个列表。

现在假设已经检查了列表的每个元素,它们是相同的,并且较短列表中没有下一个元素。然后声明较短的列表小于较长的列表。

示例:

>>> [1,2]<[1,3]
True
>>> [1,2]<[1,2,21]
True
>>> [1,3]<[1,2,21]
False
>>>[1,2,22]<[1,2,21]
False
>>>[1]<[1,2,21]
True
>>>

答案 3 :(得分:1)

它按元素比较列表:

>>> [1,2]<[1,3]
True
>>> [1,2]<[1,2,21]
True
>>>