列表中第一个数字没有大于变量的值

3

有没有一种快速的方法,不涉及大量的 if 语句来获取列表中第一个变量不大于我的元素?例如,如果

x = 50
compare = [1, 4, 9, 16, 25, 36, 49, 64, 81]

我希望这能返回 64。我的列表也是按升序编写的,因此不需要比较列表中的每个元素。


7
你尝试过什么?出了什么问题?比如说,next(value for value in compare if value > x) 就可以解决问题。如果数列是递增的,你也可以考虑二分查找。对于特定的数值,还有一种更快的数值方法(平方大于 x 的整数)。 - jonrsharpe
5
你认为什么是“一堆if语句”?其实只需要一个,放在一个循环里就可以了。 - John Gordon
我进行了逐元素比较,所以几乎有多少元素就有多少if语句。这几乎是最长的可能方式。你们两种方法都很好用。谢谢你们的帮助。 - somethingvague
大家好,这是一个新手。我认为你要找的是一个for循环和比较,当比较指示你要查找的状态时,使用break关键字。 - LhasaDad
compare[bisect.bisect_left(compare, x)] - 没有'if-statements'. bisect - facehugger
4个回答

5

有一种简单的方法可以做到这一点,不需要任何for循环:

>>> x = 50
>>> compare = [1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> next(item for item in compare if item >=x)
64

这将创建一个值为>= x迭代器,然后选择第一个值。


8
当然,这是一个生成器表达式,但仍然是一个“for”循环。 - Chris_Rands
我不同意。虽然它仍然是一个迭代结构,但它不是一个for循环,而且我认为它更加简洁和表达力强。当然,意见因人而异,如果你不喜欢函数式编程,你可能会发现一个简单的循环更明显。 - larsks
7
这是一个for循环。它的字面意思是for。并且具有相同的时间复杂度。 - jonrsharpe
你看起来非常信奉那个理论。所以,当然。这完全是一回事。 - larsks

1
使用循环。测试每个元素,并在找到所需内容时跳出循环。
result = None
for el in compare:
    if x < el:
        result = el
        break
if result is not None:
    print('Found', result)
else:
    print('Not found')

1
这是一个使用numpy的解决方案:

import numpy as np

x = 50
compare = np.array([1, 4, 9, 16, 25, 36, 49, 64, 81] )

compare[compare>=x][0]

1
我会使用一个 while 循环:
count = 0
while x < compare[count]:
    count += 1
print(compare[count])

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