我想找到列表中一个元素周围的两个元素。我建议这个代码(它有效),但我很确定有一种方法可以以更简单的方式做到这一点。
a = [4,5,6,8,9,15,16,18,54,60]
b = 24
i = 0
while i<len(a):
if b > a[i-1] and b < a[i+1]:
result = [a[i-1],a[i]]
i = i+1
else:
i = i+1
Run Code Online (Sandbox Code Playgroud)
它返回给我:
>>> result
[18, 54]
Run Code Online (Sandbox Code Playgroud)
你知道python的函数吗?
我会使用二分搜索。您需要找到大于的第一个元素b或小于的最后一个元素b。比如说,我们在某个索引处通过二分搜索找到了更大的第一个元素的索引j。那么对于其他情况,我们的答案是 b[j - 1]、b[j] 等等。这在 O(logN) 时间内有效。
import bisect
def find(a, b):
n, j = len(a), bisect.bisect_left(a, b)
if a[j] > b:
return (None if j == 0 else a[j-1]), a[j]
else:
return a[j], (None if j >= n - 1 else a[j + 1])
if __name__ == '__main__':
a = [4,5,6,8,9,15,16,18,54,60]
b = 24
print find(a, 24)
print find(a, 3)
print find(a, 4)
print find(a, 7)
print find(a, 60)
Run Code Online (Sandbox Code Playgroud)
更短的方法:
import bisect
def find(a, b):
n, j = len(a), bisect.bisect_left(a, b)
return ((None if j == 0 else a[j-1]), a[j]) if a[j] > b else (a[j], (None if j >= n - 1 else a[j + 1]))
Run Code Online (Sandbox Code Playgroud)
重要提示:数组应该按排序顺序
| 归档时间: |
|
| 查看次数: |
2236 次 |
| 最近记录: |