【问题标题】:creating a function for for-loop across specific set of ranges in python在python中的特定范围内创建一个for循环函数
【发布时间】:2021-08-05 09:28:45
【问题描述】:

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

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

【问题讨论】:

  • 调用 range(1,2) 返回 1 而不是 1 和 2

标签: python python-3.x for-loop range


【解决方案1】:

简单,但最有可能效率最低的解决方案是使用嵌套的 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)

【讨论】:

    【解决方案2】:

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

    这是另一种解决方案,它带有一个返回生成器的函数:

    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)))
    

    【讨论】:

    • 这并不能解决问题。我需要它作为一个函数
    • 你想要的函数的参数是什么?范围列表?如果是这样,您可以轻松地将此代码合并到一个函数中。
    • @mufty__py 查看我修改后的答案。我创建了一个函数,它接收与不连续范围相对应的元组列表,并返回一个可以像范围一样使用的生成器。
    【解决方案3】:

    要从可迭代列表中获得不同范围的可迭代对象,您可以使用chain 函数,如以下响应https://stackoverflow.com/a/67547449/1287983 中所示。

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

    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]

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

    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 循环中使用它?
    • @mufty__py 我通过添加在 for 循环中使用结果的方式来编辑响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    相关资源
    最近更新 更多