Python:在列表中找到一个数字(较小但最大)

时间:2018-12-17 06:32:17

标签: python-3.x algorithm list

假设我们使用的是python: 如果是整数a,则给出整数列表。我们应该找到这个数字: 它应该小于a; 它是所有小于a的数字中最大的数字;

例如a=3, list=[1,2,3,4],且数字应为2

在没有任何外部软件包的情况下,我应该如何实现?

6 个答案:

答案 0 :(得分:4)

假设列表存储在l = [1,2,3,4,5]中,内置的filter可以为您提供条件成立的元素:

l = [1,2,3,4,5]
a = 3
f = filter(lambda x: x < a, l) #This stores elements that are smaller than a in a filter object
num = max(f) # filter is an iterable and max() built-in is difined on it
# num == 2

答案 1 :(得分:2)

您需要list comprehensionmax

a = 3
l = [1,2,3,4]
print(max([x for x in l if x<a]))
# 2

答案 2 :(得分:2)

最多匹配列表

a=3
list=[1,2,3,4]
max_val=max([el for el in list if el < a])
print (max_val)

答案 3 :(得分:2)

另一种相同的方法可以是:

 l = [1, 2, 3, 4, 5]
 a = 3
 def fun(x): return x < a
 f = filter(fun, l)
 num = max(f)
 print(num)

答案 4 :(得分:2)

作为不同解决方案的比较,所有答案都是无症状的O(n)。在这里,我使用魔术函数%memit%timeit在jupyternotebook中比较了其中的三个:

import timeit
import random
%load_ext memory_profiler
l = list(range(100000)) # Create a long list
random.shuffle(l)       # Let's shuffle the list
a = 50000               # Set the target variable the middle element

这是一个执行问题所需功能的函数:

def max_less_than(a,l):
    c = None
    for i in l:
        if i < a:
            c = max(c,i) if c else i
    return c

以下是基于列表理解和过滤器的两种解决方案:

result = max([x for x in l if x < a]) 
result = max(filter(lambda x: x < a, l))

让我们使用timeit对其进行配置;我在每个回合中进行了四个回合,每回合进行了1000次迭代,您可以增加回合/迭代次数以获得更准确的结果:

%timeit -n 1000 -r 4 max_less_than(a,l)
# 13.5 ms ± 588 µs per loop (mean ± std. dev. of 4 runs, 1000 loops each)
%timeit -n 1000 -r 4 max(filter(lambda x: x < a, l))
# 15.7 ms ± 248 µs per loop (mean ± std. dev. of 4 runs, 1000 loops each)
%timeit -n 1000 -r 4 max([x for x in l if x < a])
# 8.07 ms ± 301 µs per loop (mean ± std. dev. of 4 runs, 1000 loops each)

似乎列表理解在CPU性能上胜过其他两个。但是我们还要检查一下内存:

%memit max_less_than(a,l)
# peak memory: 53.86 MiB, increment: 0.13 MiB
%memit max(filter(lambda x: x < a, l))
# peak memory: 53.75 MiB, increment: 0.12 MiB
%memit max([x for x in l if x < a])
# peak memory: 54.23 MiB, increment: 0.48 MiB

基于过滤器的方法使用显着更少的内存的原因是它的generator-like性质。从某种意义上说,过滤器对象的元素不会存储在内存中,但是当对对象进行某些操作时,它们将被逐一评估。 因此,总而言之,如果您主要关注内存效率(例如您的解决方案需要一遍又一遍地创建长序列的情况),则最好考虑基于生成器的内置程序。

答案 5 :(得分:0)

for(x in array)
 if(x = yournum - 1)
   result = x

只需对每个元素进行for循环。