为什么 max(*list) 和 max(list) 在 python 中做同样的事情?

Why does max(*list) and max(list) do the same thing in python?

见下例:

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

解包运算符在这里没有作用,我试图解包一个列表并获得矩阵的最大值(两个暗列表)。

您需要将列表链接到一个可迭代对象中才能使其正常工作。 itertools.chain 会让你这样做:

from itertools import chain

max(chain(*f))

要在没有 itertools 或其他导入的情况下解压列表,请使用嵌套理解:

max(x for row in f for x in row)

max有两种模式。如果你传入一个位置参数,例如f,会被解释为一个iterable,返回iterable的最大元素。如果您传入多个 positionnant 参数,例如*f,它将找到这些元素的最大值。由于列表在 Python 中是可比较的,所以两个版本确实是等价的。

你可以把每个子列表的最大值放到一个列表中,然后在上面调用最大值。

max(max(i) for i in f)

max 的文档提到:

builtin max

max(iterable, *[, key, default])

max(arg1, arg2, *args[, key])

...

If one positional argument is provided, it should be an iterable. The largest item in the iterable is returned. If two or more positional arguments are provided, the largest of the positional arguments is returned.

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


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

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

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

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]],返回最大的元素。

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.
>>>

正如它所说的"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),您有一个 iterable 列表列表,一次返回每个子列表。在第二种情况下,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