请参见下面的示例:
>>>f = [[1],[2],[3]]
>>>max(f)
Out[21]: [3]
>>>max(*f)
Out[22]: [3]
解包运算符在这里没有效果,我正在尝试解包列表并获得矩阵的最大值(两个暗列表)。
请参见下面的示例:
>>>f = [[1],[2],[3]]
>>>max(f)
Out[21]: [3]
>>>max(*f)
Out[22]: [3]
解包运算符在这里没有效果,我正在尝试解包列表并获得矩阵的最大值(两个暗列表)。
max
提及的文档:
最大(可迭代,* [,键,默认])
最大值(arg1,arg2,*args[,键])
...
如果提供了一个位置参数,它应该是一个可迭代的。返回可迭代对象中最大的项目。如果提供了两个或更多位置参数,则返回最大的位置参数。
在第一种情况下,您有一个位置参数,在第二种情况下,您有多个。
为了得到你想要的,这是你可以尝试的矩阵中的最大条目
max(entry for row in matrix for entry in row)
这会将一个参数传递给 max 函数,该函数是一个迭代矩阵中所有条目的生成器 - 触发第一个找到可迭代最大值的情况。
您需要将列表链接到单个迭代中才能使其正常工作。itertools.chain
会让你这样做:
from itertools import chain
max(chain(*f))
要在没有或其他导入的情况下解包列表itertools
,请使用嵌套推导:
max(x for row in f for x in row)
max
有两种模式。如果您传入单个位置参数,例如f
,它将被解释为可迭代对象,并且将返回可迭代对象的最大元素。如果您传入多个 positionnant 参数,例如*f
,它将找到这些元素的最大值。由于列表在 Python 中具有可比性,因此两个版本确实是等价的。
您可以将每个子列表的最大值放入一个列表中,然后对其调用最大值。
max(max(i) for i in f)
help(max)
应该是您的第一个停靠港。
Help on built-in function max in module builtins:
max(...)
max(iterable, *[, default=obj, key=func]) -> value
max(arg1, arg2, *args, *[, key=func]) -> value
With a single iterable argument, return its biggest item. The
default keyword-only argument specifies an object to return if
the provided iterable is empty.
With two or more arguments, return the largest argument.
max(f)
表示max
带有单个参数 ,[[1],[2],[3]]
并返回 this 的最大元素。
max(*f)
表示max
带有三个参数 ,[1], [2], [3]
并返回其中最大的一个。
显然,这些在您的示例中是等效的。
但总的来说,您应该使用前者来找到可迭代的最大值。这是正确的用例。后者将中断例如f = [1]
。
对于您的特定问题,您需要将列表列表展平为单个可迭代对象并将其传递给max
. 这是一个快速的方法:
max(element for row in f for element in row)
这是因为max
将有三个列表然后获得最大列表,所以你可以这样做sum
,对于整数列表:
>>> f=[[1],[2],[3]]
>>> max(sum(f,[]))
3
>>>
还因为:
>>> print(max.__doc__)
max(iterable, *[, default=obj, key=func]) -> value
max(arg1, arg2, *args, *[, key=func]) -> value
With a single iterable argument, return its biggest item. The
default keyword-only argument specifies an object to return if
the provided iterable is empty.
With two or more arguments, return the largest argument.
>>>
正如它所说“有两个或更多参数,返回最大的参数。”,所以我们有三个参数,所以 3>2 是True
,然后[3]
是最大的参数
或者可以使用,reduce
:
>>> from functools import reduce
>>> max(reduce(lambda x,y: x+y,f))
3
>>>
即使有点类似于疯狂物理学家的回答,但我使用.from_iterable
而不是拆包:
>>> import itertools
>>> max(itertools.chain.from_iterable(f))
3
>>>
鉴于:
mat=[
[1, 2, 3],
[4, 5, 6],
[0, 9, 10]
]
要么 要么max(mat)
将max(*mat)
给出相同的结果,因为正在比较单个子列表:
>>> max(mat)
[4, 5, 6]
>>> max(*mat)
[4, 5, 6]
在第一种情况下max(mat)
,您有一个可迭代的列表列表,一次返回每个子列表。在第二种情况下,max(*mat)
该列表列表中的元素(子列表)被解压缩到多个单独的参数中max
。
如果您想要其中具有最大值的子列表,请max
用作键函数:
>>> max(mat, key=max)
[0, 9, 10]
如果您想要二维矩阵中的单个最大值,可以将其展平:
>>> max(v for sl in mat for v in sl)
10
或者有三个max
:
>>> max(max(mat,key=max))
10