在最后一次迭代后关闭范围的Pythonic方式

时间:2016-07-14 13:44:01

标签: python python-3.x iteration

我有代码风格问题,我正在寻找下面写的pythonic实现。

我发布的(简化)代码遍历序列并返回范围。每个范围以特定条件开始和结束。范围不能重叠。我使用变量active来跟踪是否已找到范围的开头。如果在序列结束时,活动范围尚未关闭,则应添加(使用input_length作为结束索引)

下面的代码按预期工作,但我不喜欢我必须编写代码以将范围附加到结果列表两次的事实。在我遇到的实际问题中,这个块更长,我不想在for循环之后第二次写它。

您对我如何改善这一点有什么建议吗?

谢谢!

input_length = 100
results = []

active = False
start = None
for i in range(input_length):
    condition = i % 9 == 0
    if not active and condition:
        active = True
        start = i

    condition2 = i % 13 == 0
    if active and condition2:
        active = False
        # do some additional calculations...
        results.append((start, i))

if active:
    # do some additional calculations...
    results.append((start, input_length))

print(active)
print(results)

2 个答案:

答案 0 :(得分:1)

简单的方法是编辑内部条件:

    condition2 = i % 13 == 0
    if active and (condition2 or i == input_length-1))
        active = False
        # do some additional calculations...
        results.append((start, i if condition2 else i + 1))

并删除外部。

如果你想避开i if condition2 else i + 1,你可以在range(input_length + 1)上进行迭代? (这取决于你在循环中做了什么其他事情)

答案 1 :(得分:0)

我找到了一个很好的方法:

import itertools as it

il = 100
results = []
def fun1():
    active = False
    start = None
    for i in range(il):
        condition = i % 9 == 0
        if not active and condition:
            active = True
            start = i
        condition2 = i % 13 == 0
        if active and condition2:
            active = False
            # do some additional calculations...
            results.append((start, i))
    if active:
        # do some additional calculations...
        results.append((start, il))
    return results

def fun2():
    a=b=0
    while b<il:
        yield (a,b)
        b=b+13
        a=a+9
        while a<=b-13:
            a=a+9
    if a<il:
        yield (a,il)

print fun1()
print
print [(a,b) for (a,b) in fun2()]

请在代码中查看il的不同值,并在使用之前将其与您的功能进行比较。