有效地检查元素是否位于闭合间隔之间



我有一个元素为x = (2, 3, 4, 5)的元组x。我还有另一个数据结构,它保存闭合间隔,其元素数等于元组x中的元素数,如y = ((2,3), (3.5, 4.5), (6, 9), (4, 7))

现在,我可以建立一个嵌套循环,并检查x的每个元素是否在y的相应间隔内。但问题是,对于包含10000个元素的元组来说,这花费的时间太长了。虽然效率可能无关紧要,但我确实希望代码运行得快。

注意:我说的效率是指时间方面的,代码比任何其他"明显"的解决方案运行得快。

我想知道是否有一种更有效的方法来使用Python而不是明显的嵌套循环?这似乎只能通过嵌套循环解决方案来实现。

我没有任何代码,因为我不能解决这个问题。如果我能有提示,如何使其有效,请提供给他们。

这样怎么样

>>> x = (2, 3, 4, 5)
>>> y = ((2,3), (3.5, 4.5), (6, 9), (4, 7))
>>> def f(e):
...     p, (q, r) = e
...     return q <= p  <= r
>>> list(map(f, zip(x,y)))
[True, False, False, True]

您可以使用一个循环在线性时间内实现此目标。你只需要在两个元组上迭代一次,就像这样:

x = (2, 3, 4, 5)
y = ((2,3), (3.5, 4.5), (6, 9), (4, 7))


for index, number in enumerate(x):
if number > y[index][1] or number < y[index][0]:
print(f'{number} is NOT in {y[index}')
else:
print(f'{number} is in {y[index]}')

输出为:

2在区间(2,3)
3不在区间(3.5,4.5)
4不在区间(6,9)
5在区间(4,7)

就像我说的,这个解需要O(n)而不是O(n^2)

欢迎来到SO。

虽然这对于小元组来说肯定不是很有效,但对于大元组来说,这将大大加快过程(从O(n^2)解到O(n)解)。我希望这对你有帮助。

x = (2, 3, 4, 5)
y = ((2, 3), (3.5, 4.5), (6, 9), (4, 7))
for a, b in enumerate(y):
if b[0] <= x[a] <= b[1]:
print(f'{x[a]} is in between {b}.')
else:
print(f'{x[a]} is not in between {b}')

对于布尔值:

interval = lambda t, i: [b[0] <= t[a] <= b[1] for a, b in enumerate(i)]
x = (2, 3, 4, 5)
y = ((2, 3), (3.5, 4.5), (6, 9), (4, 7))
print(interval(x, y))

都在线性(O(n))时间内!谢谢你的阅读,祝你有美好的一天。

相关内容

最新更新