可以说,有一个嵌套列表,如:
my_list = [[1, 2, 21], [1, 3], [1, 2]]
当min()
调用该函数时:
min(my_list)
收到的输出是
[1, 2]
为什么以及如何运作?有什么用例呢?
Python中的列表(和其他序列)按字典顺序进行比较,而不是基于任何其他参数.
可以将序列对象与具有相同序列类型的其他对象进行比较.比较使用词典排序:首先比较前两个项目,如果它们不同,则确定比较的结果; 如果它们相等,则比较接下来的两个项目,依此类推,直到任一序列用完为止.
来自维基百科页面上的词典排序
词典或词典顺序(也称为词汇顺序,字典顺序,字母顺序或词典(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]]
如果列表包含重复的min元素,则返回第一个
>>> 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
?如果所需的比较不是lexicographic,则key
可以使用该参数(如Padraic所述)
该min
函数有一个名为的附加可选参数key
.该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,
除数字之外的不同类型的对象按其类型名称排序
因此,如果你把a int
和a 放在list
那里你会得到最小的整数值,因为i
它的值低于l
.同样地'1'
,它的价值也会高于两者.
>>> my_list=[[1,1,21],1,'1'] >>> min(my_list) 1
Python3及其后续版本
然而,在Python3中删除了这种令人困惑的技术.它现在提出了一个TypeError
.阅读Python 3.0中的新功能
排序比较操作符(
<
,<=
,>=
,>
)提出一个TypeError
例外,当操作数没有意义的自然顺序.因此,这样的表达式1 < ''
,0 > None
或者len <= len
不再有效,并且如None < None
提高TypeError
,而不是返回False
.一个必然结果是,对异构列表进行排序不再有意义 - 所有元素必须相互比较.
>>> my_list=[[1,1,21],1,'1'] >>> min(my_list) Traceback (most recent call last): File "", line 1, in TypeError: unorderable types: int() < list()
但它适用于可比类型,例如
>>> my_list=[1,2.0] >>> min(my_list) 1
在这里我们可以看到list
包含float
值和int
值.但作为float
与int
具有可比性的类型,min
功能,在这种情况下工作.
词典排序的一个简单用例是制作可排序的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