为什么 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
的文档提到:
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
见下例:
>>>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
的文档提到:
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