当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《嵌套列表中的min/max函数如何工作?》经验,为你挑选了2个好方法。

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

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

min()调用该函数时:

min(my_list)

收到的输出是

[1, 2]

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



1> Bhargav Rao..:

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

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值.但作为floatint具有可比性的类型,min功能,在这种情况下工作.


@KevinGuan是的.他们已经废除了Py3中的混合类型比较.请参阅[Python 3.0中的新功能](https://docs.python.org/3.0/whatsnew/3.0.html#ordering-comparisons)
是的,我也很满意,但有人可以弄清楚它的一些用例吗?我想不出一个.我的意思是,一个列表比其他列表小吗?python是否有意支持它,或者它是实现的效果.
@AhsanulHaque其中一个用例(我使用过)是基于索引对嵌套列表进行排序(在我的例子中,它是第一个元素).列表是使用`csv`模块获得的.AFAIK,它必须是有意的,但我还不能确认.我会研究并告诉你.
您也可以将一个键传递给min,即'min(my_list,key = len)`,它将返回最短的列表

2> 김민준..:

词典排序的一个简单用例是制作可排序的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

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有