2016-07-14 70 views
3

我有一个代码样式问题,我正在寻找我在下面写的pythonic实现。最后一次迭代后关闭范围的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) 
+4

需要审查/改进的工作代码更适合[codereview](http://codereview.stackexchange.com/)。 – syntonym

回答

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

您有一个错误的错误。你需要比较'i == input_length-1',但是你不能只执行'results.append((start,i))'。 –

+0

@Rawing你是对的,我解决了这个问题,虽然我不确定这是否是他现在的一个很好的解决方案。 –

+0

嗯这个解决方案的问题是一个序列,最后一个元素满足条件,一个不会导致相同的范围。 – Felix

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

请检查金正日的不同值的代码和之前比较它的功能你用吧。