获取连接范围列表的索引

Dar*_*m97 7 python range

我有一个范围列表,该列表中的所有范围都具有相同的startstop,但不相同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索引的值而不“打开”该范围列表

尝试了几个小时来想出一种算法来做到这一点,我发现的最佳解决方案包括使用二分搜索来做到这一点,我认为这不是这样做的理想方式。

知道我怎样才能做到这一点吗?

Tom*_*koo 1

您可以使用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)

  • 好吧,至少它不会创建一个大小为“1,000,000”的列表 (2认同)