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

时间:2018-09-12 00:33:01

标签: python argument-unpacking

请参见以下示例:

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

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

6 个答案:

答案 0 :(得分:8)

max的文档中提到:

  

builtin max

     

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

     

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

     

...

     

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

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


要获得所需的内容,这是您可以尝试的矩阵中的最大条目

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

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

答案 1 :(得分: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中具有可比性,因此两个版本确实是等效的。

答案 2 :(得分:2)

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

max(max(i) for i in f)

答案 3 :(得分:1)

df["value"] = df.apply(calculate, axis=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]]的意思是max(*f),带有三个参数max,并返回其中最大的一个。

显然,这些在您的示例中是等效的。

但是通常,您应该使用前者来找到一个可迭代的最大值。这是正确的用例。后者将中断例如[1], [2], [3]

对于您的特定问题,您需要将列表列表展平为单个可迭代对象,并将其传递给f = [1]。这是一种快速的方法:

max

答案 4 :(得分: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
>>> 

答案 5 :(得分:1)

给出:

//If THER NOTE = 1
=IF(COUNTIFS(C:C, "Marley,Bob", D:D,"THER NOTE") = 1,COUNTIFS(C:C, "Marley,Bob", D:D,"DA")+COUNTIFS(C:C, "Marley,Bob", D:D,"THER NOTE"),0)

//If THER NOTE = 2
=IF(COUNTIFS(C:C, "Marley,Bob", D:D,"THER NOTE") = 2,COUNTIFS(C:C, "Marley,Bob", D:D,"DA")+COUNTIFS(C:C, "Marley,Bob", D:D,"THER NOTE"),0)

mat=[ [1, 2, 3], [4, 5, 6], [0, 9, 10] ] max(mat)都会得到相同的结果,因为正在比较各个子列表:

max(*mat)

在第一种情况下,>>> max(mat) [4, 5, 6] >>> max(*mat) [4, 5, 6] ,您有一个iterable列表列表,一次返回每个子列表。在第二种情况下,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