Python查找两个列表中的最小值和最大值

23

我有两个列表,如下:

l_one = [2,5,7,9,3]
l_two = [4,6,9,11,4]

我需要从两个列表中找到最小值和最大值。也就是说,我想要生成一个单一的最小值和一个单一的最大值。

我的问题是 - 最pythonic的实现方式是什么?

非常感谢任何帮助。


2
这个应该打上作业标签吗? - Scott C Wilson
5个回答

47

可以说最易读的方法是

max(l_one + l_two)
或者
min(l_one + l_two)

然而,l_one + l_two会创建一个新的列表并将其复制。如需避免复制,可以这样做:

max(max(l_one), max(l_two))
min(min(l_one), min(l_two))

那么第一个方法将复制列表并找出最大值(在内存上更昂贵)。但是第二种方法呢,速度方面需要更长时间吗? - George
@George:不,它也更快。唯一的缺点是它读起来不像第一个那么好看。 - Sven Marnach
为什么 max(l_one + l_two)max(max(l_one), max(l_two)) 更快。谢谢Sven。 - George
1
@George:第一种形式创建一个新列表,其中将包含l_onel_two中所有引用的副本。这一步需要与列表长度成比例的一些时间。第二种形式不需要复制,因此速度更快。(它必须调用max()三次,但对于非常短的列表,它甚至可能稍微慢一些,但对于非常短的列表,速度无论如何都不重要。) - Sven Marnach
@George,通常情况下,一种方法在处理小列表时更快,而另一种方法在处理长列表时更快。在这个例子中,当列表有1000个项目时,第二种方法更快。 - John La Rooy
显示剩余2条评论

17

另一种避免复制列表的方法

>>> l_one = [2,5,7,9,3]
>>> l_two = [4,6,9,11,4]
>>> 
>>> from itertools import chain
>>> max(chain(l_one, l_two))
11
>>> min(chain(l_one, l_two))
2

3
< p >(感谢AndreasT评论中的修改建议。已删除“min(min())”解决方案) < p >您甚至可能有一种更智能的解决方案,可以适用于不同的numpy数组:
import numpy as np
i1=np.array(range(5))
i2=np.array(range(4))
i3=np.array(range(-5,5))
np.min(np.concatenate([i1,i2,i3]))

1
min(min([i1,i2,i3])) does not produce the wanted result. min(min([10,2,3], [4,5], [10])) gives 4 as output, whereas the sought minimum is 2 - AndreasT

3
你可以将它们组合起来,然后调用min或max函数:
>>> l_one = [2,5,7,9,3]
>>> l_two = [4,6,9,11,4]
>>> min(l_one + l_two)
2
>>> max(l_one + l_two)
11

1
如果您想从两个列表中选择最大或最小值。我认为以下方法可行:
from numpy import maximum
result = maximum(l_one,l_two)

它将在比较这两个列表中的每个元素后返回最大值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接