为 python 中的特定范围集创建 for 循环函数

creating a function for for-loop across specific set of ranges in python

如何在多个不同的范围内循环。例如说我想 运行 特定范围集的 for 循环

1 到 2、4 到 6 和 10 到 13,

我不知道确切的最终数字,所以函数可能会有用。

的标准方法
for i in range(1,2) + range (4,6) + range (10,13)

我应该有这个

[1,4,5,6,10,11,13]

我的问题是,如果我不知道覆盖的范围总数,这不是那么有效,而且我什至无法将其创建为没有这么多参数的函数。

所以如果我想要这样的东西

for i in range(a,b) + range (c,d) + range (e,f), ..... 

但作为一个简单的函数 有人可以提供有效的方法吗?

您可以使用 itertools 链接范围:

from itertools import chain

total_range = chain(range(1,2), range(4,6), range(10,13))

print(list(total_range))
#[1, 4, 5, 10, 11, 12]

这是另一个解决方案,其功能是 returns 生成器:

def total_range(lst):
    return (i for tup in lst for i in range(tup[0], tup[1]))

list_of_ranges = [(1,2), (4,6), (10,13)]
print(list(total_range(list_of_ranges)))

要从不同范围的可迭代列表中获取可迭代对象,您可以使用 chain 函数,如下面的响应 .

为了在函数中具有动态范围,您可以执行以下操作:

def get_ranges(list_ranges):
    lower_bounds, upper_bounds = zip(*list_ranges)
    return list(chain(*list(map(
        range, lower_bounds, upper_bounds))))

get_ranges([(1,2), (4,6), (10,13)])

[1, 4, 5, 10, 11, 12]

上面的函数 return 是值列表。如果你想有效地迭代结果值,你只需要 return 迭代器而不是列表。请参阅下面的代码。

def get_ranges(list_ranges):
    lower_bounds, upper_bounds = zip(*list_ranges)
    return chain(*list(map(range, lower_bounds, upper_bounds)))

for val in get_ranges([(1,2), (4,6), (10,13), (2,5)]):
    print(val)

1 4 5 10 11 12 2 3 4

很简单,但最有可能是效率最低的解决方案是使用嵌套 for 循环,

def multi_range_loop(ranges):

    all_values = []
    for rg in ranges:
        for i in range(rg[0], rg[1]):
            all_values.append(i)
    print(all_values)

my_ranges = [[1,3],[4,7],[10,14]]
multi_range_loop(my_ranges)