我有一个范围列表,该列表中的所有范围都具有相同的start和stop,但不相同step。
例如:
[range(0, 10, 2), range(0, 10, 3)]
Run Code Online (Sandbox Code Playgroud)
当然,列表可以包含不止 2 个范围。
连接的范围列表代表以下数字:
[0, 2, 3, 4, 6, 8, 9]
Run Code Online (Sandbox Code Playgroud)
我想获取x连接范围列表的索引。
例如,最后一个示例的 5 索引将为8.
问题是范围可能很大(数百万),我不想将该范围变成列表来获取x索引。我需要以某种方式计算该x索引的值而不“打开”该范围列表
尝试了几个小时来想出一种算法来做到这一点,我发现的最佳解决方案包括使用二分搜索来做到这一点,我认为这不是这样做的理想方式。
知道我怎样才能做到这一点吗?
您可以使用range相同的start和来创建一个新的end,并将所有steps 打包到一个新列表中。现在,您可以检查该范围中的每个数字是否与任何步骤匹配。您可以将其制作成生成器:
def steps_range(start, end, steps):
for i in range(start, end):
if any(i % x == 0 for x in steps):
yield i
Run Code Online (Sandbox Code Playgroud)
现在您可以循环该生成器,直到到达相关索引。根据你的例子:
ranges = [range(0, 10, 2), range(0, 10, 3)]
start = ranges[0].start
end = ranges[0].stop
steps = [r.step for r in ranges]
target_index = 5
for i, num in enumerate(steps_range(start, end, steps)):
print(num)
if i == target_index:
break
Run Code Online (Sandbox Code Playgroud)
这将打印出来:
0
2
3
4
6
8
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
189 次 |
| 最近记录: |