4

请参见下面的示例:

>>>f = [[1],[2],[3]]
>>>max(f)
Out[21]: [3]
>>>max(*f)
Out[22]: [3]

解包运算符在这里没有效果,我正在尝试解包列表并获得矩阵的最大值(两个暗列表)。

4

6 回答 6

8

max提及的文档:

内置最大值

最大(可迭代,* [,键,默认])

最大值(arg1,arg2,*args[,键])

...

如果提供了一个位置参数,它应该是一个可迭代的。返回可迭代对象中最大的项目。如果提供了两个或更多位置参数,则返回最大的位置参数。

在第一种情况下,您有一个位置参数,在第二种情况下,您有多个。


为了得到你想要的,这是你可以尝试的矩阵中的最大条目

max(entry for row in matrix for entry in row)

这会将一个参数传递给 max 函数,该函数是一个迭代矩阵中所有条目的生成器 - 触发第一个找到可迭代最大值的情况。

于 2018-09-12T00:40:08.953 回答
4

您需要将列表链接到单个迭代中才能使其正常工作。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 中具有可比性,因此两个版本确实是等价的。

于 2018-09-12T00:36:46.197 回答
2

您可以将每个子列表的最大值放入一个列表中,然后对其调用最大值。

max(max(i) for i in f)
于 2018-09-12T00:39:33.980 回答
1

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)

于 2018-09-12T00:43:30.557 回答
1

这是因为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
>>> 
于 2018-09-12T00:49:39.717 回答
1

鉴于:

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
于 2018-09-12T00:53:37.190 回答