为 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)
如何在多个不同的范围内循环。例如说我想 运行 特定范围集的 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)