假设我们使用的是python:
如果是整数a
,则给出整数列表。我们应该找到这个数字:
它应该小于a
;
它是所有小于a
的数字中最大的数字;
例如a=3, list=[1,2,3,4]
,且数字应为2
。
在没有任何外部软件包的情况下,我应该如何实现?
答案 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 comprehension
和max
:
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循环。